AngularJS -“链接承诺”中间还有其他函数

AngularJS - "Chaining promises" with other functions in between

本文关键字:中间 其他 函数 链接承诺 链接 承诺 AngularJS      更新时间:2023-09-26

所以我有这个问题。我是angular的新手,我被告知要修改一个管理表单的指令,使提交按钮被禁用,然后在所有工作完成后再次启用。

由于被调用的函数通常是异步调用,简单地按顺序添加代码是行不通的。

var ngSubmit = function() {
  vm.disabled = true;
  $scope.ngSubmitFunction();
  vm.disabled = false;
}

按钮在ngSubmitFunction()下的异步调用完成之前启用。

所以我认为一个承诺可以解决这个问题,并做了一些像:

var promise = function() {
  return $q(function (resolve) {$scope.ngSubmitFunction()});
}
var ngSubmit = function() {
  vm.disabled = true;
  promise().then(function() {
   vm.disabled = false;
  });
}

这不会输出任何错误,但不会再次启用按钮。

尝试了不同类型的承诺声明,结果都是一样的,除了这个:

$scope.submitPromise = function() {
  return $q.when($scope.ngSubmitFunction());
}

这确实调用。then函数,但同样,不等待任何子异步函数完成。'.然后立即调用',就像顺序版本一样。

请记住,我不知道在ngSubmitFunction()下是什么。它被许多开发人员使用,它可能包含0到多个异步调用。但典型的场景是:

ngSubmitFunction()调用func()

——func()决定是调用create()还是update()

-- -- update()调用elementFactory.update(),这是一个异步调用

-- -- -- elementFactory.update().then(function())在完成后被调用。

-- -- -- --此时,我应该再次启用按钮。

我怎样才能做到这一点?是否有一种方法来链承诺与非承诺之间的功能?或者另一种方法使代码只在其他一切都完成时执行?我想在DataFactory创建一个事件,当异步调用结束,但如果update()函数调用多个异步调用,这将不起作用。

如果你正在使用承诺,你的异步函数应该返回承诺,如果他们这样做,它应该像这样工作:

var ngSubmit = function() {
  vm.disabled = true;
  $scope.ngSubmitFunction().then(() => {
      vm.disabled = false;
  });
}

我不知道ngSubmitFunction()

下面是什么

那你就倒霉了,承诺在这里帮不了你。承诺或$q.when不能神奇地检查调用,看看它启动了什么异步事情,甚至等待它们- ngSubmitFunction()需要为其异步结果本身返回一个承诺。

你需要让每个函数在你的代码库中(可能)做一些异步的事情,需要等待返回一个承诺。这是没有办法的

好吧,如果有人想知道,我们还没有找到解决方案(可能没有)。所以我们会把返回值添加到所有的函数链中,以确保ngSubmitFunction接收到一个promise,因此可以在调用'.then'之前等待它完成。这不仅使它适用于仅隐含一个承诺的情况,而且也是一种良好的编程实践。

具有多个承诺的情况很少,因此我们将在控制器本身上单独处理它们。

感谢大家的评论