Если у вас есть обещание, которое выполняется с массивом, и этот массив имеет известную длину, тогда вы можете использовать .spread()
для преобразования массива в отдельные аргументы функции. Он заменяет .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()
и слияние этих результатов в единый массив результатов.
Это может быть записано в стандартной ES6 (например, без дополнительных возможностей Bluebird в), как это:
return Promise.all([findStagingAdvanced(stagingQuery), findDboAdvanced(dboQuery)])
.then(results => results[0].concat(results[1]))
.then(allIssues => {
// allIssues contains combined results of both functions above
});
Спасибо за четкое объяснение –