AngularJS - “链接承诺”与

时间:2016-09-15 10:20:24

标签: javascript angularjs asynchronous promise chain

所以我有这个问题。我对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函数,但同样,不等待任何子异步函数完成。立即调用'.then',就像顺序版一样。

请记住,我不知道ngSubmitFunction()下的内容。它由几十个开发人员使用,它可能包含从0到多个异步调用。但典型情况如下:

  

ngSubmitFunction()调用func()

     

- func()决定是否调用create()或update()

     

- - update()调用一个异步调用的elementFactory.update()

     

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

     

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

我怎样才能做到这一点?有没有办法将承诺与非承诺函数联系在一起?或其他方式使代码只在其他一切完成时执行?我想在异步调用结束时在DataFactory上创建一个事件但是如果update()函数调用了多个异步调用,那么这将不起作用。

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

  

我不知道<h:commandLink action="#{actionToCall.toString}" value="#{actionLabel}" />

下的内容

然后你运气不好,承诺不会帮助你。 Promises或ngSubmitFunction()无法神奇地检查调用并查看它启动的异步事件甚至等待它们 - $q.when需要为其异步结果本身返回一个承诺。

你需要在你的代码库中创建每个函数,这些函数可能会做一些需要等待的异步返回一个promise。没有办法解决这个问题。

答案 2 :(得分:0)

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

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

谢谢大家的意见。