据我了解,有三种调用异步代码的方法:
- 活动,例如
request.on("event", callback);
- 回调,例如
fs.open(path, flags, mode, callback);
- 承诺
我找到了节点承诺库,但是我不明白。
有人可以解释什么是诺言,为什么我要使用它?
另外,为什么将它从Node.js中删除?
据我了解,有三种调用异步代码的方法:
request.on("event", callback);
fs.open(path, flags, mode, callback);
我找到了节点承诺库,但是我不明白。
有人可以解释什么是诺言,为什么我要使用它?
另外,为什么将它从Node.js中删除?
Answers:
由于这个问题仍然有很多观点(例如我的观点),我想指出:
一个承诺是一个“事物”,它代表了操作的“最终”结果。这里要注意的一点是,它抽象掉的细节,当有事情发生,让您专注于应该发生什么后说有事。这将产生干净,可维护的代码,其中的代码将类似于以下内容:
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
方法应返回一个新的Promise,该Promise将在给定SuccessHandler或failureHandler回调完成时得到满足。这意味着当您有一组需要执行的异步任务时,您可以将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
要了解有关承诺及其为何超酷的更多信息,请查看Domenic的博客:http : //domenic.me/2012/10/14/youre-missing-the-point-of-promises/
这种新的教程从笔者承诺PouchDB可能是我在任何地方见过的最好的。它明智地涵盖了经典的菜鸟错误,向您显示了正确的用法模式,甚至是一些仍常用的反模式-甚至在其他教程中也是如此!
请享用!
PS:我没有回答这个问题的其他部分,因为其他部分已经很好地覆盖了它们。
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库现在是开源的。
deferreds
and resolve
和deferred.promise.then
and预定义promiseActions
。您是否有机会对Node.js这么简单的了解?
promise的另一个优点是,错误处理以及引发和捕获异常的方法比尝试使用回调处理要好得多。
在蓝鸟库实现承诺,并为您提供一流长的堆栈跟踪,速度非常快,并警告有关未被捕获的错误。根据http://bluebirdjs.com/docs/benchmarks.html的介绍,与其他Promise库相比,它还更快,使用的内存更少。
什么是诺言?
一个promise只是一个代表异步操作结果的对象。一个承诺可以处于以下三种状态中的任何一种:
待定 ::这是初始状态,表示未实现或拒绝承诺。
已实现 ::这表示已兑现承诺,表示可以使用承诺表示的值。
被拒绝 ::这意味着操作失败,因此无法兑现承诺。除州外,我们还需要了解与承诺相关的三个重要实体
executor function :: executor function定义需要执行的异步操作,其结果由promise表示。一旦promise对象初始化,它将开始执行。
resolve :: resolve是传递给executor函数的参数,如果执行程序成功运行,则调用此resolve传递结果。
reject :: reject是传递给executor函数的另一个参数,在executor函数失败时使用。失败原因可以传递给拒绝项。
因此,每当我们创建一个Promise对象时,我们都必须提供Executor,Resolve和Reject。
参考:: 承诺
Promise对象代表异步操作的完成或失败。
因此,要实现承诺,您需要两个部分:
1. 创造承诺:
promise构造函数接受一个名为executor的函数,该函数具有2个参数resolve和reject。
function example(){ return new Promise (function(resolve , reject){ //return promise object if(success){ resolve('success'); //onFullfiled }else{ reject('error'); //onRejected } }) }
2。处理承诺:
Promise对象具有3种处理Promise对象的方法:-
1. Promise.prototype.catch(onRejected)
2.Promise.prototype.then(onFullfiled)
3.Promise.prototype.finally(onFullfiled,onRejected)
example.then((data) =>{ //handles resolved data console.log(data); //prints success }).catch((err) => { //handles rejected error console.log(err); //prints error })