所以我有这个问题。我对 Angular 相当陌生,有人告诉我修改一个管理表单的指令,以禁用提交按钮,然后在所有工作完成后再次启用。
由于被调用的函数通常具有异步调用,因此简单地按顺序添加代码是行不通的。
var ngSubmit = function() {
vm.disabled = true;
$scope.ngSubmitFunction();
vm.disabled = false;
}
按钮在 ngSubmitFunction() 下的异步调用完成之前启用。
所以我认为 promise 可以解决这个问题,并做出了类似的事情:
var promise = function() {
return $q(function (resolve) {$scope.ngSubmitFunction()});
}
var ngSubmit = function() {
vm.disabled = true;
promise().then(function() {
vm.disabled = false;
});
}
这不会输出任何错误,但永远不会再次启用该按钮(.then 永远不会被调用)。
尝试了不同类型的 promise 声明,所有结果都相同,除了这个:
$scope.submitPromise = function() {
return $q.when($scope.ngSubmitFunction());
}
这确实调用了 .then 函数,但同样,不会等待任何子异步函数完成。 '.then' 会被立即调用,就像顺序版本一样。
请记住,我不知道 ngSubmitFunction() 下有什么。它被数十个开发人员使用,并且可能包含 0 到多个异步调用。但典型的场景是这样的:
ngSubmitFunction() calls func()
-- func() decides wether to call create() or update()
-- -- update() calls a elementFactory.update() which is an async call
-- -- -- elementFactory.update().then(function()) is called when finished.
-- -- -- -- At THIS point, I should enable the button again.
我怎样才能实现这个目标?有没有办法将 promise 与非 promise 功能链接起来?或者另一种方法使代码仅在其他一切完成后才执行?我考虑过当异步调用结束时在 DataFactory 中创建一个事件,但如果 update() 函数调用多个异步调用,则这是行不通的。
最佳答案
如果您使用 Promise,您的异步函数应该返回 Promise,如果它们这样做,它应该像这样工作:
var ngSubmit = function() {
vm.disabled = true;
$scope.ngSubmitFunction().then(() => {
vm.disabled = false;
});
}
关于javascript - AngularJS - "Chaining promises"以及其间的其他函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39508644/