对于这里给出的例子:
https://github.com/petkaantonov/bluebird/blob/master/API.md#props---promise
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)
阶段并行执行这些函数,然后返回结果对象。有没有办法做到这一点?
答案 0 :(得分:2)
将我的评论转化为可能包含这个问题的答案......
您的示例与Bluebird代码示例完全相同。在Bluebird示例中,函数getPictures()
和getComments()
以及getTweets()
被称为BEFORE Promise.props()实际上被调用 - 与代码示例中的相同。传递给Promise.props()
的是一个属性为promises的对象。
因此,您的示例和Bluebird示例中的内容如下:
if (cond1)
,启动getTweets()
并将结果承诺分配给propObj.tweets。异步操作在后台继续。if (cond2)
,启动getPictures()
并将结果承诺分配给propObj.pictures。异步操作在后台继续。if (cond3)
,启动getComments()
并将结果承诺分配给propObj.comments。异步操作在后台继续。promise.props(propObj)
,它只是迭代propObj
的属性,然后等待调用.then()
处理程序,直到它找到的所有承诺都完成。.then()
处理程序。已经调用了生成承诺的初始函数,并且操作已经在运行中。您的代码与Bluebird示例的工作方式不同。不确定你要解决什么问题。
当然,您确实知道如果您的函数实际上只是同步函数调用,那么在常规Javascript中没有并行操作同步函数调用,因为这里的主线程是单线程的。一次只能执行一件事。如果操作是异步的(例如网络或异步文件I / O),那么在启动调用后会得到一些实际的并行操作,因为本机代码库在初始调用返回后处理其他线程中的事物),但这不是适用于常规同步函数调用。