2016-12-21 5 views
-3

Я работаю над своим первым приложением Nodejs, кто-то еще разработал это приложение передо мной, и я пытаюсь исправить некоторую проблему и не понимаю, как следующий.Может кто-нибудь помочь мне понять, что такое использование .spread в библиотеке Bluebird

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

ответ

1

Если у вас есть обещание, которое выполняется с массивом, и этот массив имеет известную длину, тогда вы можете использовать .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 
    }); 
+0

Спасибо за четкое объяснение –

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 
})