蓝鸟,承诺,然后()
我一直只使用蓝鸟几天,但我想要去所有我的旧代码,并promisify
它:)
我的问题是我还没有完全掌握then()
命令的stream程。
考虑这两个块:
一个
methodThatReturnsAPromise().then(task2).then(task3);
乙
var promise = methodThatReturnsAPromise(); promise.then(task2) promise.then(task3);
-
在场景中,
task3
会得到task2
的结果吗? 在B他们都得到了第一个承诺的结果? -
第二个与蓝鸟运行
Promise.all
有什么不同? -
这些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);
希望这解释了两者之间的差异