【问题标题】:How to use Promise inside controller in angularjs? [duplicate]如何在angularjs的控制器中使用Promise? [复制]
【发布时间】:2017-06-04 15:51:53
【问题描述】:

我正在学习 angularjs 并尝试使用 Promise 将问候语附加到 h3 标签。但它不起作用(没有错误日志)。

angular.module('app', []).controller('test', function ($scope) {
  $scope.greeting = 'Hello world!';
  
  let p1 = new Promise(r => r('Hi'));  
  let p2 = new Promise(r => r('Im Gosu'));
  
  Promise.all([p1, p2]).then(p => {
    $scope.greeting = `${p[0]} ${p[1]}`;
    
    console.log(p[0]);
    console.log(p[1]);
  });
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="app" ng-controller="test">
  <h3 ng-bind="greeting"></h3>
</div>

我错过了什么?

【问题讨论】:

  • 使用 $q。除非您确定自己需要它,否则您不需要本地承诺。
  • 并且不要使用 Angular 1.2.23。它已经有好几年了。当前版本是 1.6.x。
  • @estus 谢谢!为什么必须是 $q 而不是 Promise?
  • $q 与消化循环紧密相关,也“更同步”。 SO 上已经有一堆 $q vs Promise 主题了。

标签: javascript angularjs


【解决方案1】:

Angular 需要知道你的 Promise 已被解析以触发更改检测周期,重新评估视图中使用的表达式 greeting,检测它已更改,并更新 DOM。

如果您使用 angular $q 服务,那是自动的,因为每次解决 $q 承诺时,$q angular 服务都会触发更改检测。通过使用本机承诺,您正在改变 Angular 背后的模型状态。

所以,要么使用 $q,要么了解你在做什么,然后在回调函数的末尾添加 $scope.$apply(),以通知 Angular 你已经更改了模型。

【讨论】:

  • 谢谢!我已经多次阅读您的答案。这真的很有帮助。在阅读您的答案之前,我还没有认为这是一项功能。
猜你喜欢
  • 2016-09-17
  • 1970-01-01
  • 2015-08-18
  • 1970-01-01
  • 1970-01-01
  • 2013-10-29
  • 2017-08-01
  • 1970-01-01
  • 2018-09-29
相关资源
最近更新 更多