AngularJS -“链接承诺”中间还有其他函数
AngularJS - "Chaining promises" with other functions in between
所以我有这个问题。我是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'之前等待它完成。这不仅使它适用于仅隐含一个承诺的情况,而且也是一种良好的编程实践。
具有多个承诺的情况很少,因此我们将在控制器本身上单独处理它们。
感谢大家的评论
- 如何添加浮动和非浮动,其他
- 与其他库的jQuery.noConflict()
- 播放当前视频时如何停止其他视频?JavaScript
- 剑道UI内联编辑:如何在点击其他按钮时隐藏按钮
- 制作一个不带HTML a标记但在动画播放完毕后指向其他页面的超链接
- 除修剪外的其他功能
- 为什么grunt contrib connect的中间件选项的第三个参数是未定义的
- 是什么让一个“;Uncaught RangeError:超过了最大调用堆栈大小“;错误(Chrome,在其他浏览器中显示
- Array.length似乎不起作用;console.log则显示其他情况
- 如何消除代码中的未定义和其他问题
- 如何覆盖锚点元素's href目标,并在我点击转到目标javascript时删除其他错误
- jquery代码在Mozilla中有效,但在其他浏览器上无效
- 为什么不推荐使用“with”?是否有更好或其他方法可以“下降”到对象的命名空间
- Jquery未定义函数正在停止其他操作
- 如何将我的javascript库公开给其他客户端使用
- Javascript阻止其他Javascript代码
- 高图表柱形图,柱形中间有其他标签
- Express.js - 头盔.js和其他中间件,以及挂载的应用程序
- 是否可以访问封闭函数's这个或其他没有中间全局变量的变量
- AngularJS -“链接承诺”中间还有其他函数