2

上一节讲述了promise的原理及实现,这一节为大家带来两个基于promise封装的库,方便我们在项目实战中能够方便采用promise处理异步。

一、q库 www.nodejs.com/pageage/q

安装: npm install q --save


let Q = require('q');
let p = new Promise(function(resolve,reject){
    resolve('hello,promise')
})

1.Q的all方法 和Promise.all方法一样,都是等待多个异步请求结果,在做出操作

Q.all([p,p,p]).then(([a,b,c])=>{console.log(a,b,c)});
Promise.all([p,p,p]).then(([a,b,c])=>{console.log(a,b,c)})

2.Q的fcall方法,将一个同步的函数,转换为一个成功的promise对象,支持调用then方法,并且可以把同步函数的返回值,传入then的成功回调中作为参数。
它和Promise对象的resolve方法,不太一样。Promise的resolve方法,也是生成一个成功的promise对象,但是确是将resolve的参数传入promise对象成功回调中作为成功回调参数。

Q.fcall(function(){return '123'}).then(res=>{console.log(res)});
Promise.resolve(function(){return '123'}).then(res=>{console.log(res)})

3.defer对象 和 promise的defer处理方式和调用方式相同。

let fs = require('fs');
function readFile(path){
    let defer = Q.defer();
    fs.readFile(path,'utf8',function(err,data){
        err?defer.reject(err): defer.resolve(data);
    })
    return defer.promise;
}
readFile('./1.txt').then(res=>{console.log(res)});

二、bluebird

上面q库 主要是对原有promise方法 进行了封装和改造,bluebird库 主要是对promise原有功能进行了扩展,
主要是添加了 promisify和promisifyAll两个方法,可以将异步方法promise化。

安装 npm intall bluebird --save

1、promisify 将一个异步方法promise化

let blueBird = require('bluebird');
let read = blueBird.promisify(fs.readFile);
read('./2.txt','utf8').then(res=>{console.log(res)});

promisify 的实现原理,就是利用高阶函数返回一个函数的特性,完成一个promise实例的封装

function myPrimisify (fn){
    return function (...args){
       return new Promise(function(resolve,reject){
                fn(...args,function(err,data){
                    err?reject(err):resolve(data)
                })
        })
    }
}
let read2 = myPrimisify(fs.readFile);
read2('./2.txt','utf8').then(res=>{console.log(res)});

2.promisifyAll 将一个对象上面所有的方法,都promise化,生成一个属性名为‘原有方法’+‘Async’的方法,都可以支持异步方法.

blueBird.promisifyAll(fs);
fs.readFileAsync('./2.txt','utf8').then(res=>{console.log(res)});

实现原理:

function myPromisifyAll(obj){
    Object.keys(obj).forEach((item,index)=>{
        if(typeof obj[item]=='function')
        obj[item+'Async']  =myPrimisify(obj[item])
    })
}
myPromisifyAll(fs);
fs.readFileAsync('./2.txt','utf8').then(res=>{console.log(res)});

这里介绍了q库和bluebird库对原有primise的改造和升级,更加方便我们在开发过程中利用promise完成异步处理。


乔实
42 声望3 粉丝

好记性不如烂笔头,我没笔,只有键盘