繁体   English   中英

AngularJS - “链接承诺”与其他功能之间

[英]AngularJS - “Chaining promises” with other functions in between

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

由于被调用的函数通常具有异步调用,因此仅按顺序添加代码不起作用。

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()函数调用多个异步调用,这将无效。

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

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

我不知道ngSubmitFunction()下的ngSubmitFunction()是什么

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

您需要在代码库中创建每个函数(可能)执行需要等待的异步返回promise。 没有办法解决这个问题。

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

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

谢谢大家的意见。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM