了解node.js中的promise

时间:2010-11-28 11:27:04

标签: javascript node.js promise

根据我的理解,有三种方法可以调用异步代码:

  1. 事件:例如。 request.on("event", callback);
  2. 回调:例如。 fs.open(path, flags, mode, callback);
  3. 承诺
  4. 我找到了一个承诺库https://github.com/kriszyp/node-promise,但我没有得到它。

    有人可以解释一下承诺是什么以及我为什么要使用它?

    另外,为什么它从Node.js中删除了?

9 个答案:

答案 0 :(得分:99)

由于这个问题仍然有许多观点(比如我的观点),我想指出:

  1. node-promise 看起来对我很不公平(最后一次提交大约是1年前)并且几乎没有测试。
  2. 期货模块对我来说看起来非常臃肿,并且记录严重(我认为命名惯例很糟糕)
  3. 最好的方法似乎是q framework,它既活跃又有充分记录。

答案 1 :(得分:90)

node.js中的promise承诺做一些工作,然后有单独的回调,可以执行成功和失败以及处理超时。在node.js中考虑promises的另一种方法是它们是只能发出两个事件的发射器:成功和错误。

关于promises的一件很酷的事情是你可以将它们组合成依赖链(只有当Promise A Promise B完成时才做Promise C。)

通过从核心node.js中删除它们,它创建了构建具有不同promises实现的模块的可能性,这些promises可以位于核心之上。其中一些是node-promisefutures

答案 2 :(得分:19)

承诺是一个“事物”,它代表了操作的“最终”结果。这里需要注意的是,当发生某些事情时,它会抽象出的详细信息,并让您专注于之后发生的事情。这将产生干净,可维护的代码,而不是在回调内部的回调中进行回调,您的代码看起来有点像:

 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

方法应返回在给定的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/

答案 3 :(得分:12)

new tutorial作者对Promise的PouchDB可能是我见过的最好的。它明智地涵盖了经典的菜鸟错误,显示了正确的使用模式,甚至还有一些仍然常用的反模式 - 即使在其他教程中也是如此!!

享受!

PS我没有回答这个问题的其他部分,因为他们已经被其他人很好地覆盖了。

答案 4 :(得分:7)

Mike Taulty has a series of videos,每个人都不到十分钟,描述了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实现,它传递了Promise / A +测试套件。我非常喜欢API,因为它的样式与WinJS界面类似。

2014年4月更新

顺便提一下,WinJS库is now open source

答案 5 :(得分:5)

promises的另一个优点是错误处理和异常抛出和捕获比尝试使用回调处理错误要好得多。

bluebird库实现了promises并为您提供了很长的堆栈跟踪,非常快,并且警告未捕获的错误。根据{{​​3}}

,它也比其他承诺库更快,使用更少的内存

答案 6 :(得分:4)

承诺究竟是什么?

promise只是一个表示异步操作结果的对象。承诺可以是以下3种状态中的任何一种:

待定 ::这是初始状态,意味着承诺既未履行也未被拒绝。

履行 ::这意味着承诺已经履行,意味着承诺所代表的价值已准备就绪。

拒绝 ::这意味着操作失败,因此无法履行承诺。 除了各州之外,还有三个与承诺相关的重要实体我们真正需要理解

  1. executor function :: executor函数定义需要执行的异步操作,其结果由promise表示。它会在promise对象初始化后立即开始执行。

  2. resolve :: resolve是传递给执行程序函数的参数,如果执行程序成功运行,则会调用此解析传递结果。

  3. reject :: reject是传递给执行函数的另一个参数,它在执行函数失败时使用。失败原因可以传递给拒绝。

  4. 因此,每当我们创建一个promise对象时,我们都会提供Executor,Resolve和Reject。

    参考:: Promises

答案 7 :(得分:0)

我最近也在寻找node.js中的promises。到目前为止when.js似乎是由于其速度和资源使用的方式,但q.js上的文档让我更加了解。所以使用when.js但q.js文档来理解主题。

来自github上的q.js自述文件:

  

如果函数无法返回值或抛出异常而没有   阻止,它可以返回一个承诺。承诺是一个对象   表示函数的返回值或抛出异常   可能最终提供。承诺也可以用作a的代理   远程对象,以克服延迟。

答案 8 :(得分:0)

Promise对象表示异步操作的完成或失败。

因此,要实现承诺,您需要两个部分:-

1. 创建承诺:

promise构造函数接受一个称为executor的函数,该函数具有 2个参数解析和拒绝。

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
})