了解Node.js中的承诺

据我了解,有三种调用异步代码的方法:

  1. 活动,例如 request.on("event", callback);
  2. 回调,例如 fs.open(path, flags, mode, callback);
  3. 承诺

我找到了节点承诺库,但是我不明白。

有人可以解释什么是诺言,为什么我要使用它?

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

小小2020/04/03 10:39:57

我最近也一直在研究node.js中的promises。到目前为止,由于它的速度和资源使用情况,when.js似乎是可行的方法,但是q.js上的文档使我有了更好的理解。因此,请使用when.js而非q.js文档来理解该主题。

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

如果函数不能返回值或抛出异常而不阻塞,则可以返回一个Promise。Promise是一个对象,代表函数最终可能提供的返回值或引发的异常。Promise也可以用作远程对象的代理,以克服延迟。

番长樱梅2020/04/03 10:39:57

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

  1. node-promise对我来说似乎已经死了(上一次提交是在1年前),并且几乎没有测试。
  2. 期货模块看起来很臃肿的我,被严重记录(我认为的命名约定是有害的)
  3. 最好的方法似乎是q框架,该框架既活跃又有据可查。
DavaidTony宝儿2020/04/03 10:39:57

什么是诺言?

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

未决 ::这是初始状态,表示未实现或拒绝承诺。

已实现 ::这表示已实现诺言,表示已准备好使用诺言表示的值。

被拒绝 ::这意味着操作失败,因此无法兑现承诺。除了州,我们还需要了解与承诺相关的三个重要实体

  1. executor function :: executor function定义了需要执行的异步操作,其结果由promise表示。一旦promise对象初始化,它将开始执行。

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

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

因此,每当我们创建一个Promise对象时,我们都必须提供Executor,Resolve和Reject。

参考:: 承诺

小卤蛋2020/04/03 10:39:57

Mike Taulty 拥有一系列视频,每个视频都不到10分钟,描述了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库现在是开源的

猴子村村2020/04/03 10:39:57

Promise的另一个优点是,错误处理以及异常引发和捕获比尝试使用回调处理要好得多。

蓝鸟库实现承诺,并为您提供一流长的堆栈跟踪,速度非常快,并警告有关未被捕获的错误。根据http://bluebirdjs.com/docs/benchmarks.html的介绍,与其他Promise库相比,它还更快,使用的内存更少。

番长猴子2020/04/03 10:39:57

这种新的教程从笔者承诺PouchDB可能是我在任何地方见过的最好的。它明智地涵盖了经典的菜鸟错误,向您显示了正确的用法模式,甚至是一些仍常用的反模式-甚至在其他教程中也是如此!

请享用!

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

小胖2020/04/03 10:39:57

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

关于promise的很酷的事情是您可以将它们组合到依赖关系链中(仅在Promise A Promise B完成时才执行Promise C )。

通过将它们从核心node.js中删除,它创造了构建具有不同实现承诺的模块的可能性,这些实现可以位于核心之上。其中一些是节点承诺期货