- 1、本文档共3页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
then 方法是这样子的:
这篇文章主要介绍了 NodeJS 中利用 Promise 来封装异步函数,使用统一的链式 API 来
摆脱多重回调的噩梦,非常的实用的小技能,希望小伙伴们能够喜欢
在写 Node.js 的过程中,连续的 IO 操作可能会导致“金字塔噩梦” ,回调函数的多重嵌
套让代码变的难以维护,利用 CommonJs 的 Promise 来封装异步函数,使用统一的链式 API
来摆脱多重回调的噩梦。
Node.js 提供的非阻塞 IO 模型允许我们利用回调函数的方式处理 IO 操作,但是当需要
连续的 IO 操作时,你的回调函数会多重嵌套,代码很不美观,而且不易维护,而且可能会
有许多错误处理的重复代码,也就是所谓的“ Pyramid of Doom ”。
代码如下 :
step1(function (value1) {
step2(value1, function(value2) {
step3(value2, function(value3) {
step4(value3, function(value4) {
Do something with value4 }); });
});
});
这其实就是 Node.js 的 Control flow 的问题,对于这个问题,解决方案都许多,比如利
用 async,或者 eventProxy 等,不过本文的主题是利用 CommonJs 规范中对 Promise 来解决
这个问题。
什么是 Promise?
CommonJs
的
Promise
规范有许多种,我们一般讨论的是
Promise/A+ 规范,它定义了
Promise 的基本行为。
Promise 是一个对象,它通常代表一个在未来可能完成的异步操作。这个操作可能成功
也可能失败,所以一个 Promise 对象一般有 3 个状态: Pending,Fulfilled ,Rejected。分别代
表未完成、成功完成和操作失败。一旦 Promise 对象的状态从 Pending 变成 Fulfilled 或者
Rejected 任意一个,它的状态都没有办法再被改变。
一个 Promise 对象通常会有一个 then 方法,这个方法让我们可以去操作未来可能成功后
返回的值或者是失败的原因。这个
promise.then(onFulfilled, onRejected)
显而易见的是, then 方法接受两个参数, 它们通常是两个函数, 一个是用来处理操作成
功后的结果的, 另一个是用来处理操作失败后的原因的, 这两个函数的第一个参数分别是成
功后的结果和失败的原因。如果传给 then 方法的不是一个函数,那么这个参数会被忽略。
then 方法的返回值是一个 Promise 对象,这一个特点允许我们链式调用 then 来达到控制
流程的效果。这里有许多细节上的问题,比如值的传递或者错误处理等。 Promise 的规范是
这样定义的:
onFulfilled 或者 onRejected 函数的返回值不是 Promise 对象,则该值将会作为下一个 then
方法中 onFulfilled 的第一个参数, 如果返回值是一个 Promise 对象,怎么 then 方法的返回值就是该 Promise 对象
onFulfilled 或者 onRejected 函数中如果有异常抛出, 则该 then 方法的返回的 Promise 对象状态转为 Rejected,如果该 Promise 对象调用 then,则 Error 对象会作为 onRejected 函数
的第一个参数
如果 Promise 状态变为 Fulfilled 而在
法返回的 Promise 对象状态变为 Fulfilled
同理。
then 方法中没有提供且成功的结果为上一个
onFulfilled Promise
函数,则的结果,
then 方
Rejected
补充一句, onFulfilled 和 onRejected 都是异步执行的。
规范的实现: q
上面讲的是 Promise 的规范,而我们需要的是它的实现, q 是一个对 Promise/A+ 有着较好实现规范的库。
首先我们需要创建一个 Promise 对象,关于 Promise 对象创建的规范在 Promise/B 中,
这里不做详细的解释,直接上代码。
代码如下 :
function(flag){
var defer = q.defer();
fs.readFile(a.txt, function(err, data){
if(err) defer.reject(err);
else defer.resolve(data);
});
return d
文档评论(0)