所有的承诺取决于另一个承诺的结果

$q.all promise depends on result of another promise

本文关键字:一个承诺 结果 承诺 取决于      更新时间:2023-09-26

我目前有三个嵌套的promise,我想把它们变成$q.all调用。

它看起来像这样。

ds.saveData(data).then(function (result1){
    someOtherVar = result1.Id;
    ds.saveSomethingDependant(someOtherData).then(function (result2){
        ds.saveAThirdThing(someOtherVar).then(function (result3){
            ns.notify();
        }, function (error){
            ns.error(error);
        });
    }, function (error){
        ns.error(error);
    });
}, function (error) {
    ns.error(error);
});

哇,真是一团糟。我关心的是在哪里编辑OtherVar。有没有其他方法可以做到这一点,这样我就没有嵌套的promise,但在一个promise之后仍然编辑数据?嵌套的承诺对来说是一场噩梦

谢谢!

由于result2依赖于result1,因此必须等到后者准备好后才能执行前者。但是,如果第一个和第三个操作不相互依赖,您仍然可以使用$q.all

$q.all({
  saveData: ds.saveData,
  saveAThirdThing: ds.saveAThirdThing
}).then(function(results) {
  /* expect(results).toEqual({
   *   saveData: result1,
   *   saveAThirdThing: result3
   * });
   */
  return saveSomethingDependent(results.saveData.Id);
}).then(function(result2) {
  // all done
  ns.notify();
}, function(error) {
  // something in the chain above failed
  ns.error(error);
});

我们利用了这样一个事实,即您可以从解析处理程序返回promise,然后解析处理程序将在将该promise发送到链中的下一个promise之前解析该promise(从而避免嵌套)。

您还可以通过将拒绝处理程序放在链的末尾来进行一些简化,因为您在示例中以相同的方式处理所有错误。

让我们说一下简单可读的方法链

var saveDate = function(data) {
  return ds.saveDate(data);
}
var saveOtherthings = function(result) {
  return $q.all([ds.saveSomethingDependant(result.id), ds.saveAThirdThing(result.id)])
}
saveDate(data)
  .then(saveOtherthings)
  .then(function(result) {
    ns.notify();
  }, function(error) {
    ns.error(error);
  });