据我了解,调用异步代码的方式有以下三种:
- 事件,例如
request.on("event", callback);
- 回调,例如
fs.open(path, flags, mode, callback);
- Promise
我找到了node-promise 库,但我不明白。
有人可以解释一下 Promise 的全部内容以及我为什么要使用它吗?
另外,为什么它从 Node.js 中删除了?
据我了解,调用异步代码的方式有以下三种:
request.on("event", callback);
fs.open(path, flags, mode, callback);
我找到了node-promise 库,但我不明白。
有人可以解释一下 Promise 的全部内容以及我为什么要使用它吗?
另外,为什么它从 Node.js 中删除了?
由于这个问题仍然有很多观点(比如我的),我想指出:
node.js 中的 Promise Promise做一些工作,然后有单独的回调,这些回调将在成功和失败以及处理超时时执行。在 node.js 中考虑 promise 的另一种方式是,它们是只能发出两个事件的发射器:成功和错误。
Promise 很酷的一点是你可以将它们组合成依赖链(只有当 Promise A和Promise B 完成时才执行 Promise C )。
通过从核心 node.js 中删除它们,它创造了构建具有不同Promise实现的module的可能性,这些module可以位于核心之上。其中一些是node-promise和futures。
一个promise是一个“事物”,可以说是代表一个操作的“最终”结果。这里要注意的一点是,它抽象了某事发生时的细节,并让您专注于某事发生后应该发生的事情。这将产生干净、可维护的代码,而不是在回调内部的回调中包含回调,您的代码看起来有点像:
var request = new Promise(function(resolve, reject) {
//do an ajax call here. or a database request or whatever.
//depending on its results, either call resolve(value) or reject(error)
//where value is the thing which the operation's successful execution returns and
//error is the thing which the operation's failure returns.
});
request.then(function successHandler(result) {
//do something with the result
}, function failureHandler(error) {
//handle
});
Promise的规范指出Promise的
then
方法应该返回一个新的promise,当给定的successHandler 或failureHandler 回调完成时该promise 完成。这意味着当您有一组需要执行的异步任务时,您可以将 promise 链接在一起,并确保操作的顺序得到保证,就像您使用回调一样。因此,不是在回调内部的回调中传递回调,而是具有链式Promise的代码如下所示:
var doStuff = firstAsyncFunction(url) {
return new Promise(function(resolve, reject) {
$.ajax({
url: url,
success: function(data) {
resolve(data);
},
error: function(err) {
reject(err);
}
});
};
doStuff
.then(secondAsyncFunction) //returns a promise
.then(thirdAsyncFunction); //returns a promise
要了解更多关于 Promise 以及它们为什么超级酷的信息,请查看 Domenic 的博客:http : //domenic.me/2012/10/14/youre-missing-the-point-of-promises/
Mike Taulty有一系列视频,每个视频都不到十分钟,描述了 WinJS Promise 库的工作原理。
这些视频内容丰富,Mike 设法通过一些精心挑选的代码示例展示了 Promise API 的强大功能。
var twitterUrl = "http://search.twitter.com/search.json?q=windows";
var promise = WinJS.xhr({ url: twitterUrl });
promise = promise.then(
function (xhr) {
},
function (xhr) {
// handle error
});
如何处理异常的处理特别好。
尽管有 WinJs 参考,但这是一个普遍感兴趣的视频系列,因为 Promise API 在其许多实现中大致相似。
RSVP是通过 Promise/A+ 测试套件的轻量级 Promise 实现。我非常喜欢 API,因为它在风格上与 WinJS 界面相似。
2014 年 4 月更新
顺便提一下,WinJS 库现在是开源的。