博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
利用promise写出更加优美的nodejs程序
阅读量:6706 次
发布时间:2019-06-25

本文共 2940 字,大约阅读时间需要 9 分钟。

  hot3.png

什么是promise

promise一个标准,它描述了异步调用的返回结果,包括正确返回结果和错误处理。关于详细的说明文档可以参考。目前实现promise标准的模块有很多,如、和,下面我们以为例,介绍一下promisenodejs中的使用方法。

###将一般的异步调用的函数转换为promise风格的函数 比如一般情况下,我们异步读取文件会写出下面的代码:

fs.readFile("test.txt",function(err,data){    if(!err){        console.log(data);    }else{        console.error(err);    }});

我们可以把fs.readFile函数封装为promise风格的函数,如下:

var preadFile = function(file){    fs.readFile(file,function(err,data){        var deferred = Q.defer();        if(!err){            deferred.resolve(data);        }else{            deferred.reject(err);        }        return deferred.promise;    });}

这样我们就可以这样调用这个方法了:

//then 的第一个参数是正确处理函数,第二个参数是错误处理函数preadFile("test.txt").then(console.log,console.error);

可以看到这样调用更加直接明了。

###使用方法

  1. 各个回调函数顺序传递数据: 在nodejs中我们回去数据时,时常遇回调函数的返回结果需要传递给下一个回调函数,到时很大的回调函数嵌套,promise 可以很轻松的在回调函数之间传递参数,看下面的例子:

    var fun1 = function (data,cb) {    cb(null,data+" fun1");}var fun2 = function (data,cb) {    cb(null,data+" fun2");}var fun3 = function (data,cb) {    cb(null,data+" fun3");}function main(data,cb){    fun1(data,function(err,data){        if(!err){            fun2(data,function(err,data){                if(!err){                    fun3(data,cb);                }else{                    cb(err);                }            });        }else{            cb(err);        }    });}

可以看到main函数为了得到数据,需要嵌套调用fun1,fun2fun3,如果需要调用很多函数,那么会形成很大的回调函数嵌套调用,导致代码看起来很丑陋,而且不容易维护,下面我们改用promise重写这段代码:

var Q = require("q");    var fun1 = function (data) {        var deferred = Q.defer();        deferred.resolve(data+" fun1");        return deferred.promise;    }        var fun2 = function (data) {        var deferred = Q.defer();        deferred.resolve(data+" fun2");        return deferred.promise;    }        var fun3 = function (data) {        var deferred = Q.defer();        deferred.resolve(data+" fun3");        return deferred.promise;    }    function main(data,cb){       fun1("test")           .then(fun2)           .then(fun3)           .done(function(data){               cb(null,data);//ok 获得的最终数据为 --->"test fun1 fun2 fun3"           },function(err){               cb(err);//failed           });    }
  1. 收集各个回调函数产生的数据:有时候我们需要执行很多回调函数,然手把这个回调函数的数据一齐传递给一个函数处理,此时我们可以使用allspread方法,参看如下代码:

    var Q = require("q");var fun1 = function (data) {    var deferred = Q.defer();    deferred.resolve(data+" fun1");    return deferred.promise;}var fun2 = function (data) {    var deferred = Q.defer();    deferred.resolve(data+" fun2");    return deferred.promise;}var fun3 = function (data) {    var deferred = Q.defer();    deferred.resolve(data+" fun3");    return deferred.promise;}Q.all([    fun2("test1"),fun3("test2"),fun4("test3")    ]).spread(function(){        console.log(arguments);//获得的参数为('test1 fun1', 'test2 fun2', 'test3 fun3' )    });
  2. 统一处理错误:传统的回调函数方式使用的话,我们需要在每一个回调函数里判断是否有错误需要处理,这样会存在很多冗余代码,使用promise的话,可以使用done或者fail统一在一个函数中处理错误,如第一个例子一样,使用done方法的第二个参数处理错误。

转载于:https://my.oschina.net/sundq/blog/227410

你可能感兴趣的文章
Maven编译代码的相关命令
查看>>
stingray 页面布局与设计
查看>>
江南白衣整理和开发的java常用工具类
查看>>
Android.mk 文件语法详解
查看>>
android的armeabi和armeabi-v7a
查看>>
android自己定义控件系列教程-----仿新版优酷评论剧集卡片滑动控件
查看>>
URAL 2031. Overturned Numbers (枚举)
查看>>
emacs的常用配置备份
查看>>
lvs之 lvs+nginx+tomcat_1、tomcat_2+redis(lvs dr 模式)
查看>>
让js中的函数只有一次有效调用的三种常用方法
查看>>
python实现算24的算法
查看>>
Extending a logical volume in a virtual machine running Red Hat or Cent OS (1006371)
查看>>
Linux挂载共享命令
查看>>
语义化的HTML首先要强调HTML结构
查看>>
小白学数据分析----->回归分析在游戏人气分析的应用探索
查看>>
权限管理页面控制
查看>>
操作xml格式的字符串的方法(C#)
查看>>
[转]MySQL索引详解(1)
查看>>
poj 3040 Allowance 贪心
查看>>
分享27款最佳的复古风格 WordPress 主题
查看>>