javascript - AngularJS - "Chaining promises"以及其间的其他函数

标签 javascript angularjs asynchronous promise chain

所以我有这个问题。我对 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/

相关文章:

javascript - 在 JavaScript 中将 canvas 设为全局对象是一个好习惯吗?

javascript - 什么是在文本框中插入文本的 jquery 插件,它在聚焦时消失了?

javascript - 无法访问父范围的属性,但是我可以通过该属性链看到

testing - Ember-auth 登录测试因 json 失败

c# - 为什么要对 QueueBackgroundWorkItem 使用异步?

javascript - Canvas.drawImage 只是不绘制图像

javascript - 为什么 Polymer 中的数据绑定(bind) polyfill 不能在 <style> 标签内工作?

angularjs - 发送请求而不在 Angular js中添加 header

javascript - 将点击事件绑定(bind)到 AngularJS 指令内的子元素

c# - 如何在 MVC 应用程序中处理长请求