[英]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.