#node.js #promise #q
#node.js #обещаю #q
Вопрос:
У меня есть куча функций в массиве allFunctions
. Я хочу, чтобы они выполнялись один за другим с задержкой между ними. Самое близкое, что я могу придумать, это:
result = Q();
allFunctions.forEach(function(fn) {
result = result.then(fn).delay(1000);
})
Возможно ли это сделать с Q.all
синтаксисом?
Заранее благодарю вас 🙂
Ответ №1:
Не имеет смысла, обещание является уже начатой операцией и Q.all
ожидает завершения всех действий вместе.
В настоящее время у вас есть обычный способ сделать это, и он очень похож на синхронную версию (цикл for со сном).
Вы можете немного сократить его с помощью Array.prototype.reduce
, хотя:
var result = allFunctions.reduce(function(prev,fn){
return prev.then(fn).delay(1000);
},Q());
Ответ №2:
Вы можете вложить между вашими функциями a Q().delay( 1000 )
Это означает, что вам пришлось бы сопоставить ваш функциональный массив с:
function delay(){ return Q.delay(1000); }
var functions = [ f1, delay, f2, delay, f3 ];
Q.all
не будет запускать ваши функции последовательно, то, что вы делаете с prev.then
, является интересным взломом, но вы также можете запустить его так, как предлагает Q (подробнее здесьhttps://github.com/kriskowal/q#sequences ):
var results = functions.reduce(Q.when, Q(initialVal));
Включение задержек в ваш функциональный массив также обеспечит больший контроль над задержками (если вы в конечном итоге захотите другие временные задержки)
Комментарии:
1. Вы оба написали «правильный» ответ. Я задал другой вопрос, поскольку он был первым. Извините. :/
2. Я бы, конечно, не назвал связывание обещаний с
then
взломом. Это чрезвычайно распространенная практика в базах кода promise. Выполнение Q.when является просто статическим аналогомthen
.3. @BenjaminGruenbaum Я говорил о выполнении сокращения с помощью новой функции, которая помещает then на предыдущую 🙂 Нет использования самого then