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



对于这里给出的示例:

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的对象。

那么,在你的例子和蓝鸟的例子中发生的事情如下:

  1. if (cond1),启动getTweets(),并将结果promise分配给propObj.tweets。异步操作在后台继续。
  2. if (cond2),启动getPictures(),并将生成的promise赋值给propObj.pictures。异步操作在后台继续。
  3. if (cond3),启动getComments(),并将结果promise赋值给propObj.comments。异步操作在后台继续。
  4. 调用promise.props(propObj),它只是迭代propObj的属性,然后等待调用.then()处理器,直到它找到的所有承诺都完成。
  5. 最终所有异步操作完成,.then()处理器被调用。

生成承诺的初始函数已经被调用,操作已经在执行中。你的代码与蓝鸟的例子没有什么不同。不知道你想解决什么问题。

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

最新更新