题
据我了解,有三种调用异步代码的方法:
- 事件,例如
request.on("event", callback);
- 回调,例如
fs.open(path, flags, mode, callback);
- 承诺
我找到了 节点宣传库 但是我不明白。
有人可以解释什么诺言是什么,为什么我应该使用它?
另外,为什么从node.js中删除?
其他提示
由于这个问题仍然有很多观点(如我的),所以我想指出:
- 节点促销 看上去对我来说已经死了(最后一个提交大约是1年前),几乎没有测试。
- 这 期货 模块对我看上去很肿,记录在很糟糕的情况下(我认为命名惯例很糟糕)
- 最好的走似乎是 Q框架, ,既活跃又有据可查。
承诺是一个“事物”,代表可以说操作的“最终”结果。这里要注意的是,它抽象了 什么时候 发生了一些事情,让您专注于应该发生的事情 后 发生了什么事。这将导致干净,可维护的代码,其中您的代码在回调中没有在回调中进行回调,而是看起来有点像:
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
});
承诺的规格指出了承诺的
then
方法应返回一个新的承诺,当给定的成功手或失败手回调完成时,方法应兑现。这意味着,当您拥有一组需要执行的异步任务时,您可以将其链接在一起,并确保操作的顺序可以保证,就像您使用了回调一样。因此,与其在回调内回调的回调,而是带有链接承诺的代码看起来像:
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
要了解有关承诺以及他们为什么超级酷的更多信息,请结帐Domenic的博客: http://domenic.me/2012/10/14/youre-missing-the-point-of-promises/
Mike Taulty 有一系列视频, ,他们每个人都不到十分钟,描述了Winjs承诺图书馆的工作方式。
这些视频非常有用,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在其许多实现中大致相似。
敬请回复 是通过Promise/A+测试套件的轻量级承诺实现。我非常喜欢API,因为它的样式与WinJS接口相似。
更新2014年4月
顺便说一句,温伊斯图书馆 现在是开源的.
承诺的另一个优点是,错误处理和异常投掷和捕捉要比试图通过回调来处理它要好得多。
这 蓝鸟 图书馆实施承诺,并为您提供巨大的堆栈痕迹,非常快,并警告未知错误。它也比其他承诺库更快,并且使用的内存少。 http://bluebirdjs.com/docs/benchmarks.html
诺言到底是什么?
承诺只是代表异步操作结果的对象。在以下三个州中的任何一个国家中都可以承诺:
待办的 ::这是最初的状态,意味着承诺既没有实现也不拒绝。
实现 ::这意味着承诺已经实现,这意味着可以使用承诺代表的价值。
被拒绝 ::这意味着操作失败了,因此无法履行承诺。除了各州,我们确实需要了解的诺言有三个重要实体
executor函数:: executor函数定义了需要执行的异步操作,其结果由承诺表示。一旦初始化了承诺对象,它就会开始执行。
Resolve :: Resolve是传递给执行程序函数的参数,如果执行程序成功运行,则该分辨率称为传递结果。
拒绝::拒绝是传递给执行程序函数的另一个参数,当执行程序函数失败时,将使用它。失败原因可以传递给拒绝。
因此,每当我们创建一个承诺对象时,我们都必须提供执行者,解决和拒绝。
参考 :: 承诺