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

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

我找到了 节点宣传库 但是我不明白。

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

另外,为什么从node.js中删除?

有帮助吗?

解决方案

Node.js的承诺承诺将做一些工作,然后进行单独的回调,这些回调将因成功和失败以及处理超时而执行。想到Node.js的承诺的另一种方法是,它们是可以发出两个事件的发射器:成功和错误。

关于承诺的很酷的事情是,您可以将它们结合到依赖链中(只有在承诺a时才承诺c 承诺B完成)。

通过将它们从核心node.js中删除,它创造了有可能建立具有不同承诺实现的模块的可能性,这些诺言可以放在核心的顶部。其中一些是 节点促销期货.

其他提示

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

  1. 节点促销 看上去对我来说已经死了(最后一个提交大约是1年前),几乎没有测试。
  2. 期货 模块对我看上去很肿,记录在很糟糕的情况下(我认为命名惯例很糟糕)
  3. 最好的走似乎是 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/

新教程 作者的承诺 pouchdb 可能是我在任何地方看到的最好的。它明智地涵盖了经典的新秀错误,向您展示了正确的使用模式,甚至还有一些仍然常用的反图案 - 即使在其他教程中也是如此!

享受!

附言:我没有回答这个问题的其他部分,因为它们已经被其他问题涵盖了。

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

诺言到底是什么?

承诺只是代表异步操作结果的对象。在以下三个州中的任何一个国家中都可以承诺:

待办的 ::这是最初的状态,意味着承诺既没有实现也不拒绝。

实现 ::这意味着承诺已经实现,这意味着可以使用承诺代表的价值。

被拒绝 ::这意味着操作失败了,因此无法履行承诺。除了各州,我们确实需要了解的诺言有三个重要实体

  1. executor函数:: executor函数定义了需要执行的异步操作,其结果由承诺表示。一旦初始化了承诺对象,它就会开始执行。

  2. Resolve :: Resolve是传递给执行程序函数的参数,如果执行程序成功运行,则该分辨率称为传递结果。

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

因此,每当我们创建一个承诺对象时,我们都必须提供执行者,解决和拒绝。

参考 :: 承诺

最近,我也一直在调查Node.js的承诺。迄今为止 当js 由于其速度和资源的使用,似乎是要走的方式,但是文档上的文档 Q.JS 给了我更好的理解。因此,请使用时使用Q.JS文档来理解主题。

来自 Q.JS 在github上读书:

如果一个函数无法在不阻止的情况下返回值或投掷异常,则可以返回承诺。承诺是表示函数最终可能提供的返回值或抛出的异常的对象。承诺也可以用作远程对象克服延迟的代理。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top