Обещание обрабатывать по одному (последовательно) - PullRequest
0 голосов
/ 31 мая 2018
function one_by_one(objects_array, iterator, callback) {
  var start_promise = objects_array.reduce(function (prom, object) {
    return prom.then(function () {
      return iterator(object);
    });
  }, Promise.resolve()); // initial
  if(callback){
    start_promise.then(callback);
  }else{
    return start_promise;
  }
}


one_by_one(requestBodyAll,task);

Я попробовал приведенный выше код, но он обработал только первый файл.Может кто-нибудь помочь, пожалуйста?

  • requestBodyAll - содержит список файлов для обработки.задача - функция возвращает обещание.

1 Ответ

0 голосов
/ 31 мая 2018

выглядит примерно так.Если уменьшение не прогрессирует после первого файла, то, скорее всего, task(first_file) выбрасывает.Вы можете узнать об этом, регистрируя ошибки.

Кроме того, вам лучше возвращать обещание от one_by_one и не передавать обратный вызов.

function one_by_one(objects_array, work) {
    return objects_array.reduce(function (prom, object) {
        return prom.then(function() {
            return work(object);
        });
    }, Promise.resolve()); // initial
}

one_by_one(requestBodyAll, someWorkFn)
.then(task)
.catch(function(error) {
    console.log(error);
});

one_by_one() доставит (как в вопросе) результат iterator(last_file) в качестве аргумента task.Вы можете предпочесть ничего не передавать, в этом случае напишите:

.then(function() {
    return task();
})

Вы можете защитить процесс от ошибок, перехватывая внутри one_by_one().

...