蓝鸟,承诺然后()

Mad*_*d0g 40 javascript node.js promise bluebird

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

我的问题是我仍然没有完全掌握then()命令的流程.

考虑这两个块:

一个

methodThatReturnsAPromise().then(task2).then(task3);
Run Code Online (Sandbox Code Playgroud)

var promise = methodThatReturnsAPromise();
promise.then(task2)
promise.then(task3);
Run Code Online (Sandbox Code Playgroud)
  1. 在方案A中task3会得到结果task2吗?在B中他们都得到了第一个承诺的结果?

  2. 第二个与Promise.all蓝鸟的运行方式有何不同?

  3. Promise.all在使用该catch方法时,这些A/B/有何不同(我在哪里放).

对不起,这是一堆问题.

Ben*_*aum 48

欢迎来到美好的承诺世界.

then在你的例子中如何工作

你的断言1是正确的.我们可以模拟使用Promise.resolve值在Bluebird中解析的承诺.

让我们来看看:

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

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

foo().then(alert);
Run Code Online (Sandbox Code Playgroud)

这一小段会提醒"Value"我们可以看到.

现在,让我们再创建两个promise,每个promise都会发出警报并返回不同的值.

function task2(e){
    alert("In two got " + e);
    return " Two ";
}
function task3(e){
    alert("In three got " + e);
    return " Three ";
}
Run Code Online (Sandbox Code Playgroud)

因此,正如您在第一个代码中看到的那样,它确实会在链中解析,每个链都具有前一部分的值.

在第二个示例中,task2和task3将获得相同的值并且也将一起执行(即,任务3不会等待任务2).你可以看到在这里.

Promise.all

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

抓住了

您始终将catch放在您希望捕获错误的位置.正如你通常在同步代码中那样.只记得总是投入承诺或承诺的代码.


Ber*_*rgi 12

在方案中,task3将获得task2的结果?在B中他们都得到了第一个承诺的结果?

是.

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

您不会将(并行)任务2和3的结果提取到新的承诺中.

在使用catch方法时,这些A/B/Promise.all有何不同(我在哪里放).

通常你会把它放在链的末尾,除非你想捕获一个特定的错误.

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)
Run Code Online (Sandbox Code Playgroud)

  • 我想我大部分时间都明白它是如何工作的.非常直观,我希望我可以回到过去,擦掉几个月我花在回击和金字塔上的斗争:)谢谢你的回答.我会给另一个人答案,因为他有点快,做了那些伟大的jsfiddles,但有一个upvote代替 - 很好的回答 (3认同)