我有一个客户列表,然后每个客户都有一系列要运行的任务。在psudeocode中:

Get all customers
For each customer, get list of tasks
For each task, run task


但是,我想在运行这些任务时利用JavaScript的异步特性。有了承诺,我可以做类似的事情:

getAllCustomers().then(function(customers) {
  var taskGetters = [];
  customers.forEach(function(customer) {
    taskGetters.push(getCustomerTasks(customer).then(function(tasks) {
      var taskDoers = [];

      tasks.forEach(function(task) {
        taskDoers.push(doTask());
      });

      return promise.all(taskDoers);
    });
  });

  return promise.all(taskGetters);
}).then(function() {
  // clean up
}).catch(function() {
  // handle error
});


但是,这遇到了回调存在的一些结构性问题-我开始嵌套东西,而不是保持诺言应具有的干净的伪同步结构。在保留诺言的结构优势的同时,我该如何解决呢?

最佳答案

如果我记得您正在使用蓝鸟,那么您可以:

getAllCustomers().map(function(customer) {
  return Promise.map(customer, getCustomerTasks).map(doTask);
}).then(function() {

}).catch(function() {
  // handle error
});

09-30 19:32
查看更多