javascript - 等待所有步骤成功或失败的异步步骤

标签 javascript promise

我有一个服务器端 Node.JS 脚本,它通过 (1) 将上传内容保存到特定位置并 (2) 将其记录在数据库中来处理文件上传。我一直在使用 Asynquence 库及其门函数(相当于 Promise.all)来并行执行这些步骤,但我需要序列的行为,以便在任一步骤失败时撤消另一步骤(如果成功)。显然,撤消步骤只有在其匹配步骤已经成功时才能执行(即删除文件或数据库记录)

Gate 似乎不适用于这种情况,因为如果任何步骤失败,它都会触发错误处理程序。是否有等待所有步骤成功或失败的函数?

最佳答案

如果您将 catch 视为 try 的异步对应物,那么您可以构建一个快速包装器来包装传递给 gate 的每个值或 Promise.all 并返回“成功”或“失败”的结果。

function waitForAll(inputArray) {
  // Return Promise.all on an array where for each array value...
  return Promise.all(inputArray.map(function(x) 
    // ...we wrap it in a tiny dict with the semantics we want.
    return Promise.resolve(x).then(function(value) {
      return { success: true, value: value };
    }, function(error) {
      return { success: false, error: error };
    });
  }));
}

作为奖励,由于您可以在包装器中根据 promise 执行任何操作,您甚至可以通过单独的 channel 快速报告失败,或者在任何异步步骤失败时立即开始取消或回滚成功的操作。

关于javascript - 等待所有步骤成功或失败的异步步骤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43323474/

相关文章:

javascript - 按钮和 AJAX 没有响应

javascript - 使用 jquery 设置选择表单的值

javascript - 我的 debounce axios 请求的实现让 promise 永远处于挂起状态,有没有更好的方法?

javascript - 在异步代码中运行同步代码 - promise

javascript - sinon.stub().returns 为每次调用而不是一次指定

javascript - 只能对 div 进行排序(如果它们的主体中没有很多标签)

javascript - Ember.js:如何使用模型的单个实例创建路由/ Controller

javascript - AJAX和DOM功能故障

javascript - 为什么这个带有 promise 的测试没有通过?

javascript - Promise 解析器/拒绝器可以触发它的对立面吗?