Как использовать Q. все с задержкой?

#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