对于这里给出的示例:
https://github.com/petkaantonov/bluebird/blob/master/API.md道具——承诺Promise.props({
pictures: getPictures(),
comments: getComments(),
tweets: getTweets()
}).then(function(result) {
console.log(result.tweets, result.pictures, result.comments);
});
现在,如果我想动态地构建props对象?像
var propObj = {};
if (cond1) {
propObj.tweets = getTweets();
}
if (cond2) {
propObj.pictures = getPictures();
}
if (cond3) {
propObj.comments = getComments();
}
Promise.props(propObj)
.then(function(result) {
console.log(result);
});
上面的代码不会像预期的那样工作。函数getTweets、getPictures、getComments将在构造propsObj期间强制执行。
然而,我实际寻找的是在Promises.props(propObj)
阶段并行执行这些函数,然后返回结果对象。有办法做到这一点吗?
把我的评论变成一个也许可以概括这个问题的答案…
您的示例与Bluebird代码示例的工作方式相同。在蓝鸟示例中,函数getPictures()
和getComments()
和getTweets()
在Promise.props()被实际调用之前被调用-与您的代码示例相同。传递给Promise.props()
的是一个属性为promise的对象。
那么,在你的例子和蓝鸟的例子中发生的事情如下:
-
if (cond1)
,启动getTweets()
,并将结果promise分配给propObj.tweets。异步操作在后台继续。 -
if (cond2)
,启动getPictures()
,并将生成的promise赋值给propObj.pictures。异步操作在后台继续。 -
if (cond3)
,启动getComments()
,并将结果promise赋值给propObj.comments。异步操作在后台继续。 - 调用
promise.props(propObj)
,它只是迭代propObj
的属性,然后等待调用.then()
处理器,直到它找到的所有承诺都完成。 - 最终所有异步操作完成,
.then()
处理器被调用。
生成承诺的初始函数已经被调用,操作已经在执行中。你的代码与蓝鸟的例子没有什么不同。不知道你想解决什么问题。
你当然会意识到,如果你的函数实际上只是同步函数调用,那么在常规Javascript中就没有同步函数调用的并行操作,因为这里的主线程是单线程的。实际上一次只执行一件事。如果操作是异步的(例如网络或异步文件I/O),那么在调用启动后你会得到一些实际的并行操作,因为本机代码库在初始调用返回后在其他线程中处理事情),但对于常规的同步函数调用不会发生。