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)
在方案A中task3会得到结果task2吗?在B中他们都得到了第一个承诺的结果?
第二个与Promise.all蓝鸟的运行方式有何不同?
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(或者只是从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)
| 归档时间: |
|
| 查看次数: |
35381 次 |
| 最近记录: |