8

在我的控制器中,我得到了另一项服务的承诺。我在其中添加了一个“then”子句,但从未调用过“then”。

看到这个 plunker:http ://plnkr.co/edit/dX0Oz1?p=preview (javascript 版本

'fakeLongRunningPromise' 创建一个承诺,在 2 秒后自行解决。

在控制器本身中,一旦承诺得到解决,我就会向控制台发送一条注释。

我可以说承诺正在解决,因为它输出到控制台的“正在解决的承诺”。为什么它不输出“承诺已解决”?

认为由于控制器返回,承诺可能会“超出范围”?

4

2 回答 2

12

AngularJS 的 promise 解析结果在 $digest 循环内异步传播。因此,注册的回调then只有在进入 $digest 循环时才会被调用。在“AngularJS 世界之外”setTimeout执行,因此不会触发回调。

解决方案是使用Scope.$apply$timeout服务。这是带有 $apply 的版本:

      window.setTimeout(function() {
        console.log("Resolving promise");
        $scope.$apply(function(){
          deffered.resolve("worked");
        });
      }, 2000);

这是一个固定的 plunk (JavaScript):http ://plnkr.co/edit/g5AnUK6oq2OBz7q2MEh7?p=preview

于 2013-01-09T21:32:52.880 回答
2

我已经使用$timeout而不是setTimeout它的工作原理:

 # Resolve the promise after 2 seconds
  $timeout( ()->
    console.log "Resolving promise"
    deffered.resolve ("worked")
  , 2000)
于 2013-01-09T21:37:31.060 回答