2015-12-25 3 views
1

Я хочу использовать Promise.all() для обработки двух объектов обещания, но второй является внутренним выражением if. Как справиться с этой ситуацией?Как использовать выражение в Promise.all()?

Это выглядит следующим образом:

functionA(); 

if(true) { 
    functionB(); 
} 

functionA() и functionB() оба возвращают объект обещание. В обычном случае, я мог бы использовать

Promise.all([ 
    functionA(), 
    functionB() 
]).then(resule => { 
    console.log(result[0]); // result of functionA 
    console.log(result[1]); // result of functionB 
}) 

Но как справиться с выражением if? Должен ли я обернуть if(true){functionB()} в new Promise()?

ответ

1

Ну, вы можете использовать if с, если вы используете обещания в качестве прокси для значений, или вы можете вложить обещание на один уровень - лично - я предпочитаю использовать их в качестве прокси-серверов. Позвольте мне объяснить:

var p1 = functionA(); 
var p2 = condition ? functionB() : Promise.resolve(); // or empty promise 
Promise.all([p1, p2]).then(results => { 
     // access results here, p2 is undefined if the condition did not hold 
}); 

или подобно:

var p1 = functionA(); 
var p2 = condition ? Promise.all([p1, functionB()]) : p1; 
p2.then(results => { 
    // either array with both results or just p1's result. 
}); 

Обертывание условную в new Promise является explicit construction и его следует избегать.

+0

Как 'Promise.all()' будет ассимилировать * значения *, а также обещания, что 'Promise.resolve()' в первом решении может быть значением, которое было бы недорогим способом для ввода значения по умолчанию, когда 'functionB()' не вызывается. [Демо] (https://jsfiddle.net/fabup5aq/). –

Смежные вопросы