承诺过程一个接一个(顺序)

时间:2018-05-31 00:47:56

标签: promise sequential

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 - 包含要处理的文件列表。 task - function返回promise。

1 个答案:

答案 0 :(得分:0)

看起来正确。如果减少没有超过第一个文件,那么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()内部来免受错误处理。