蓝鸟,承诺,然后()

我一直只使用蓝鸟几天,但我想要去所有我的旧代码,并promisify它:)

我的问题是我还没有完全掌握then()命令的stream程。

考虑这两个块:

一个

 methodThatReturnsAPromise().then(task2).then(task3); 

 var promise = methodThatReturnsAPromise(); promise.then(task2) promise.then(task3); 
  1. 在场景中, task3会得到task2的结果吗? 在B他们都得到了第一个承诺的结果?

  2. 第二个与蓝鸟运行Promise.all有什么不同?

  3. 这些A / B / Promise.all方法在使用catch方法时有什么不同(我把它放在哪里)。

对不起,这是一大堆问题。

欢迎来到美好的诺言世界。

then你怎么在你的例子中工作

你的说法是正确的。 我们可以使用Promise.resolve来模拟在Bluebird中parsing的承诺。

我们来展示一下:

让我们得到一个返回一个promise的函数:

 function foo(){ return Promise.resolve("Value"); } foo().then(alert); 

我们可以看到,这个简短的片段会提醒"Value"

现在,我们再创build两个promise,每个promise都会提醒并返回不同的值。

 function task2(e){ alert("In two got " + e); return " Two "; } function task3(e){ alert("In three got " + e); return " Three "; } 

所以,正如你在第一个代码中看到的那样,它确实将在一个链中解决,每个链都有前一部分的值。

在第二个例子中,task2和task3都会得到相同的值,并且也会一起执行(也就是说,任务3不会等待任务2)。 你可以在这里看到。

Promise.all

Promise.all(或只是从一个履行处理程序,然后使用.spread返回一个数组)用于等待多个结果全部完成。 在你的例子中,你在多个部分中的单一结果。

赶上

你总是把抓到你想要的错误被抓住。 正如您通常在同步代码中一样。 只要记住总是在承诺或promisified代码。

在场景中,task3会得到task2的结果吗? 在B他们都得到了第一个承诺的结果?

是。

第二个与蓝鸟运行Promise.all有什么不同?

你不把(并行)任务2和3的结果转化为新的承诺。

这些A / B / Promise.all方法在使用catch方法时有什么不同(我把它放在哪里)。

通常你会把它放在链的末尾,除了你想要捕捉一个特定的错误。

 promise.catch() // handles rejections of this promise promise.then(task2).catch() // handles rejections from either promise or task2 // if promise is rejected, task2 will not be executed Promise.all(promise.then(task2), promise.then(task3)).catch() // handles rejections from any. // if promise is rejected, neither task2 nor task3 will be executed // if task2 or task3 throw, the error will immediately handled // and the other task will not be affected (but its result is unavailable) 

你没有得到一个简单的原则链接

在第一个可以写成像

 var promise = methodThatReturnsAPromise(), promise1 = promise.then(task2); promise1.then(task3); 

在第二种情况下

 var promise = methodThatReturnsAPromise(); promise.then(task2) promise.then(task3); 

希望这解释了两者之间的差异