考虑我从https://stackoverflow.com/a/28250704/460084
获取的以下代码function getExample() {
var a = promiseA(…);
var b = a.then(function(resultA) {
// some processing
return promiseB(…);
});
return Promise.all([a, b]).spread(function(resultA, resultB) {
// more processing
return // something using both resultA and resultB
});
}
以及我创建的代码https://jsfiddle.net/Lsobypup/
的演示这个想法是运行多个promise并根据结果返回一些复合值。
我不明白为什么在上面的代码中promiseA只运行一次?在我看来,使用Promise.all([a,b])它应该在a被评估时首先运行,然后在b被评估时再次运行,因为它依赖于a。但是,正如演示所示,这不会发生。
Promise.all中是否有一些魔法能够实现这一目标?这种行为有哪些规则?
答案 0 :(得分:1)
var b = a.then(function(resultA) {
// some processing
return promiseB(…);
});
这是a
的结果链接,这意味着如果a
处于已满足状态,则会立即调用回调。您的承诺a
的解决方案首先发生,因为它在all()
电话中首先遇到。
一旦实现,最终价值始终坚持承诺。
在内部,承诺可以处于以下三种状态之一:
- 待定,当最终值尚不可用时。这是唯一可能转变为其他两个州之一的州。
- 完成,当最终值可用时。履行价值与承诺永久相关。 这可以是任何值,包括undefined。
- 如果错误阻止确定最终值,则拒绝。拒绝理由与永久相关 承诺。这可能是任何值,包括undefined,尽管它是 通常是一个Error对象,就像异常处理一样。
答案 1 :(得分:0)
使用bluebird模块会非常棒 http://bluebirdjs.com/docs/api/promise.props.html
const Promise = require("bluebird");
Promise.props({
pictures: getPictures(),
comments: getComments(),
tweets: getTweets()
})
.then(function(result) {
console.log(result.tweets, result.pictures, result.comments);
});