【发布时间】:2015-08-25 02:45:39
【问题描述】:
这里给出的例子:
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) 阶段并行执行这些函数,然后返回结果对象。有没有办法做到这一点?
【问题讨论】:
-
在
Promises.props(propObj)之前执行它们有什么问题?它们都返回承诺,并将排队并在技术上并行运行。在Promises.props(propObj)行中分配时,它们会在构建对象时按顺序执行(以返回承诺)。Promises.props(propObj)只是等待propObj中的所有属性完成,然后再调用.then()。 -
您的示例与 Bluebird 代码示例的工作方式相同。在 Bluebird 示例中,函数
getPictures()和getComments()和getTweets()在实际调用Promise.props()之前被调用 - 与您的代码示例中相同。传递给Promise.props()的是一个对象,其属性是承诺。已经调用了生成承诺的初始函数,并且操作已经在进行中。您的代码与 Bluebird 示例的工作方式没有什么不同。不确定您要解决什么问题。 -
你当然会意识到,如果你的函数实际上只是同步函数调用,那么在常规 Javascript 中没有同步函数调用的并行操作,因为这里的主线程是单线程的。一次只执行一件事。如果操作是异步的(例如网络或异步文件 I/O),那么在调用启动后您会得到一些实际的并行操作,因为在初始调用返回后,本机代码库正在其他线程中处理事情),但这不会发生在常规同步函数调用中。
-
你可以通过写
Promise.props({/* object literal */}).then(...);来避免propObj的赋值。 -
@Steven10172 谢谢。这澄清了我的理解
标签: javascript promise bluebird