1. Promise的总结

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/angrysnail/article/details/80741561
Promise作为Nodejs的曾经的黑科技,一直优待着锐意写出漂亮代码的人们。简而言之,其解决了一个回调陷阱的问题,Nodejs作为以回调为品牌的语言平台,其一直得益于其疯狂的回调模式,网上更有各种评测,其以单线程支撑万计的访问量,颇有点乔峰在聚贤庄的意思。
假设这么一个场景:我们需要读取文件中的数据,然后提取其中我们需要的信息,发送到后台程序中,并接收其结果。代码示意如下:
fs.readFile('aaa.txt', function(content, e){
if(e){
console.info("打开文件失败");
return;
}
let name = content.substring(3,55);
sendToOther(name, function(e){
if(e){
console.info("you lost!");
}else {
console.info("你成功啦");
}
});
});
其实上面的代码看着还行,但是如果我在你成功之后,需要将写日志,日志书写失败,需要发短信,短信发送成功与否,需要记录,以备未来计费。。。
如果一直回调下去,我估计已经没有人能回得来神了。试想,我们在看源码的时候,经常头疼的就是调用栈,看到里面,想不起外面的上下文是什么情况,又从debugger里点出来,看外面一层的方法调用的上下文,以及其想干个啥。

那么Promise就是为了解决此问题,而出现的。上代码:
首先要明白,链式调用,现在许多程序,尤其是一些cs的程序都喜欢这个调调,其核心就是被设置或处理的主体即this,会在处理完成后返回。
那么上面的程序,我们如何进行Promise呢。
new Promise(function(resolve, reject){
fs.readFile('aaa.txt', function(content){
if(e){
reject("打开文件失败");
return ;
}
resolve(content);
// 以下程序会立即执行,不会等待resolve返回的
console.info("I will be printed right now!!!!!")
}).then(function(content){
let name = content.substring(3,55);
return name;
}).then(function(name){ // ******1******
return new Promise(function(resolve, reject)){
sendToOther(name, function(e){
if(e){
console.info("you lost!");
reject("lost when sendToOther");
}else {
console.info("你成功啦");
resolve("ok");
}
});
}
}).then(function(ok)){
//ok is ok
// go to send sms
}catch(function(e){
console.error(e);
});
});
由上述代码,可以知道,其实首个方法,用new Promise来解决,其里面的回调里,可以用then来解决同步的调用,如果想用 then来解决异步的回调,这时候,要动用then里返回Promise的方法来重新开始。
所以有两个地方要明确:
1、then方法时要两个参数,当然后者经常省略。用typescript的限制写法,可以如下:
fufilled:(a:any)=>any
failed:(a:any)=>any
ps:then中的函数,只能来传传递一个参数,不能是多个
那么,以下的方法都可以认为是第一个参数有值,第二个没值
如果想重新连起来,就弄个函数,接收上面的参数,并且返回一个Promise
2、如果想处理then中的回调,需要用新的Promise来返回
3、注意程序执行顺序,跟在resolve和reject后的内容会立即执行,不是等你的resolve返回后才执行。所以可以理解,Promise仅来协调resolve和then中指定的代码执行顺序。

以上是个架子,大体讲解了Promise的用法,及我初次使用时的困惑。BlueBird的api还有很多便利性的api,是对其的封装,随后总结。。。

猜你喜欢

转载自blog.csdn.net/angrysnail/article/details/80741561
1.