任何人都可以帮助我理解Bluebird库中.spread的用法

时间:2016-12-21 16:55:59

标签: node.js bluebird

我正在处理我的第一个Nodejs应用程序,其他人已经在我面前开发了这个应用程序,我试图解决一些问题并且无法理解以下内容。

return Promise.join(
        findStagingAdvanced(stagingQuery),
        findDboAdvanced(dboQuery)
    )     
    .spread((stagingIssues, dboIssues) => _.concat(dboIssues, stagingIssues))
    .then(....) 

2 个答案:

答案 0 :(得分:1)

如果您有一个使用数组实现的promise并且该数组具有已知长度,那么您可以使用.then()将数组转换为单个函数参数。它是someFunction().then(function(arrayOfArgs) { let arg1 = arrayOfArgs[0]; let arg2 = arrayOfArgs[1]; }); 的替代,它在调用处理程序之前将参数从数组转换为单个参数。

所以,而不是:

someFunction().spread(function(arg1, arg2) {
    // can directly access arg1 and arg2 here 
});

你可以这样做:

Promise.join()

因此,在您的特定代码示例中,return Promise.join( findStagingAdvanced(stagingQuery), findDboAdvanced(dboQuery), (stagingIssues, dboIssues) => _.concat(dboIssues, stagingIssues) ).then(allIssues => { // allIssues contains combined results of both functions above }); 已经提供了一个回调函数,可以将各个结果分开,因此根本不需要它。所以,你可以这样做:

findStagingAdvanced()

此代码正在执行的操作是从findDboAdvanced() return Promise.all([findStagingAdvanced(stagingQuery), findDboAdvanced(dboQuery)]) .then(results => results[0].concat(results[1])) .then(allIssues => { // allIssues contains combined results of both functions above }); 收集结果,并将这些结果合并为一个结果数组。

它可以用标准ES6编写(例如没有Bluebird的额外功能),如下所示:

{{1}}

答案 1 :(得分:0)

它允许您获得findStagingAdvancedfindDboAdvanced的结果并将它们合并在一起,而无需中间变量

没有传播你将有一个额外的变量将被变异:

var staging;
findStagingAdvanced(stagingQuery)
.then(stagingQuery => {
    staging = stagingQuery; // not that good practice
    return findDboAdvanced(dboQuery);
})
.then(dboQuery => {
    var merged = [staging, dboQuery];
    return ... // another promise that use staging and dboQuery together
})