了解了上面的promisea+,那么这篇文章就是扩展promise的外围方法promisify的实现。Promisify是node提供的解决回调嵌套问题的方法。使用起来非常方便;我的项目中有两个文件,一个是name.txt,里面存放的是age.txt,另一个是age.txt,里面有18个。这是为了演示多个异步接收返回值的问题。现在让我们看看原来的异步返回值。毫无疑问这是非常恶心的原始调用异步letfs=require('fs');fs.readFile('./name.txt','utf8',function(err,data){console.log(data);//age.txtif(err){console.log(err);}else{fs.readFile(data,'utf8',function(err,data){if(err){console.log(err);}else{console.log(data);}})}});既然看到了他的厌恶,我们就想办法优化一下,封装一个public函数:readpublicmethodfunctionread(...args)的封装read(...args){letdfd=Promise.defer();//这是promise中的方法我们在之前账号中封装过fs.readFile(...args,function(err,data){if(err)dfd.reject(err);dfd.resolve(data)});returndfd.promise}用法如下:read('./name.txt','utf8').then(data=>{console.log(data);returnread(data,'utf8')})。然后(数据=>{console.log(数据);})上面看起来不错,但是还是不尽如人意,因为它的功能太单一了。这时候我们的主角promisify就上场了,先来看看它原来是怎么用??的:promisify使用let{promisify}=require('util');//node提供的方法库letreadFile=promisify(fs.readFile);//用什么方法传入对应的方法,方便肥肠readFile('./name.txt','utf8').then(data=>{console.log(data);//age.txtreturnreadFile(data,'utf8')}).then(data=>{console.log(data);//18})Promisify实现上面的用法很简单,我们来简单的实现一下,用法是同上functionpromisify(fn){//你传入的方法fs.readFile/fs.writeFile。..returnfunction(...args){//传入的路径,格式//既然有then,就是一个promisereturnnewPromise((resolve,reject)=>{fn(...args,function(err,data){if(err)reject(err)resolve(data)})})}}promise.all实现promise.all方法传入一个数组,最后按顺序返回一个数组,如果其中一个数组中的items是如果失败了,那么就是失败状态用法:Promise.all([1,readFile('./name.txt','utf8'),2,readFile('./age.txt','utf8'),3]).then(data=>{console.log(data);//[1,'age.txt'(名字写的内容),2,'18'(年龄写的内容),3]});执行://检查传入的值是否为promise,返回true,否则返回falsefunctionisPromise(x){if((typeofx==='object'&&x!=null)||typeofx==='function'){if(typeofx.then==='function'){returntrue}}returnfalse}Promise.all=function(arr){//返回一个promisereturnnewPromise((resolve,reject)=>{letary=[];//用来记录返回数组的长度letidx=0;letinsertAry=(value,index)=>{ary[index]=value;if(++idx===arr.length){resolve(ary)}};//遍历传入的数组for(leti=0;i
