Простой ответ:
var promise = Q.all([func1.execute(), func2.execute()]);
promise.spread(function (data1, data2) {
// code here
})
.done();
Аннотировано:
//make `promise` be a promise for the array
var promise = Q.all([func1.execute(), func2.execute()]);
//use spread to spread the array across the arguments of a function
promise.spread(function (data1, data2) {
// code here
})
//use done so errors are thrown
.done();
Концепции в Q
определены гораздо более четко. Обещание представляет собой единственное значение, которое может быть еще недоступно. Это очень точно соответствует синхронному коду.
Чтобы представить несколько значений, мы просто используем массив. Q.all
— это вспомогательный метод, который принимает массив обещаний и возвращает обещание для массива, содержащего их выполненные значения. Если какое-либо обещание в массиве отклонено, результирующее обещание также будет отклонено.
Поскольку в этом случае мы точно знаем длину массива и, по сути, просто хотим элементы по отдельности, удобно использовать вспомогательную функцию spread
, предоставленную Q
. При вызове обещания для массива функция spread берет элементы массива и распределяет их по всем аргументам функции. Вы могли бы просто сделать:
//make `promise` be a promise for the array
var promise = Q.all([func1.execute(), func2.execute()]);
promise.done(function (data) {
var data1 = data[0];
var data2 = data[1];
// code here
});
Это, возможно, концептуально проще, но значительно менее чисто. Я настоятельно рекомендую вам прочитать https://github.com/kriskowal/q/wiki/Coming-from-jQuery, так как это действительно полезный совет для тех, кто перешел из jQuery. Если вы найдете в нем что-то, что можно улучшить, вы можете отредактировать его и, надеюсь, помочь будущим людям сделать такой же переход.
person
ForbesLindesay
schedule
22.04.2013