Bluebird Promises:动态构建props对象,但并行执行

时间:2015-08-22 23:49:09

标签: javascript promise bluebird

对于这里给出的例子:

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)阶段并行执行这些函数,然后返回结果对象。有没有办法做到这一点?

1 个答案:

答案 0 :(得分:2)

将我的评论转化为可能包含这个问题的答案......

您的示例与Bluebird代码示例完全相同。在Bluebird示例中,函数getPictures()getComments()以及getTweets()被称为BEFORE Promise.props()实际上被调用 - 与代码示例中的相同。传递给Promise.props()的是一个属性为promises的对象。

因此,您的示例和Bluebird示例中的内容如下:

  1. if (cond1),启动getTweets()并将结果承诺分配给propObj.tweets。异步操作在后台继续。
  2. if (cond2),启动getPictures()并将结果承诺分配给propObj.pictures。异步操作在后台继续。
  3. if (cond3),启动getComments()并将结果承诺分配给propObj.comments。异步操作在后台继续。
  4. 调用promise.props(propObj),它只是迭代propObj的属性,然后等待调用.then()处理程序,直到它找到的所有承诺都完成。
  5. 最终完成所有异步操作并调用.then()处理程序。
  6. 已经调用了生成承诺的初始函数,并且操作已经在运行中。您的代码与Bluebird示例的工作方式不同。不确定你要解决什么问题。

    当然,您确实知道如果您的函数实际上只是同步函数调用,那么在常规Javascript中没有并行操作同步函数调用,因为这里的主线程是单线程的。一次只能执行一件事。如果操作是异步的(例如网络或异步文件I / O),那么在启动调用后会得到一些实际的并行操作,因为本机代码库在初始调用返回后处理其他线程中的事物),但这不是适用于常规同步函数调用。