8

私のコントローラーでは、別のサービスから約束を取得しています。'then' 句を追加しましたが、'then' は呼び出されません。

このプランカーを参照してください: http://plnkr.co/edit/dX0Oz1?p=preview ( javascript バージョン)

「fakeLongRunningPromise」は、2 秒後に解決するプロミスを作成します。

コントローラー自体では、promise が解決されたらコンソールにメモを送信します。

「Resolving promise」がコンソールに出力されたので、promise が解決されていることがわかります。「解決された約束」を出力しないのはなぜですか?

コントローラーが返されるため、約束が「範囲外」になるのではないかと考えていますか?

4

2 に答える 2

12

Promise 解決の結果である AngularJS は、$digest サイクル内で非同期に伝播されます。したがって、で登録されたコールバックthenは、$digest サイクルに入ったときにのみ呼び出されます。は「AngularJS の世界のsetTimeout外」で実行されるため、コールバックはトリガーされません。

Scope.$apply解決策は、または$timeoutサービスを使用することです。$apply を使用したバージョンは次のとおりです。

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

これは固定プランク (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 に答える