我正在处理我的第一个Nodejs应用程序,其他人已经在我面前开发了这个应用程序,我试图解决一些问题并且无法理解以下内容。
return Promise.join(
findStagingAdvanced(stagingQuery),
findDboAdvanced(dboQuery)
)
.spread((stagingIssues, dboIssues) => _.concat(dboIssues, stagingIssues))
.then(....)
答案 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)
它允许您获得findStagingAdvanced
和findDboAdvanced
的结果并将它们合并在一起,而无需中间变量
没有传播你将有一个额外的变量将被变异:
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
})