2016-07-07 7 views
1

申し訳ありませんが、ここで完全なコードを表示できません。次のコードスニペットがあります。 私はサービスとコントローラを持っています。 サービス中、私はグループサービスに2秒のタイムアウトを追加して、スピナーローディングをテストしました。角度の約束の遅延が期待通りに機能しない

何とかコントローラーで、2秒待たずにすぐにコードが実行されます。

私は3つのブレークポイントをした、私が期待し、実行の順序は次のとおりです。2 - > 1 - > 3 しかし、それはここ2 - > 3 - > 1

になってしまったが、私のサービスです。

groupService.get = function() { 
    var deffered = $q.defer(); 
    deffered.promise = $getMyDataStuffPromise.then(function (data) { 
     $timeout(function() { 
      deffered.resolve(); <- break point 1 
     }, 2000); 
    }, function (error) { 
     deffered.reject(); 
     console.log('group error', error); 
    }); 

    return deffered.promise; <- break point 2 
}; 

コントローラ:

$q.all([ 
     PeopleSvc.get(), 
     GroupSvc.get() 
    ]).then(function(data){ 
      console.log('data returns, stop spinner'); <- break point 3 
     }); 

あなたは私がこのコードで間違っていたものを教えてくださいだろうか?ありがとう!

答えて

3

deffered.promise =は非常に奇妙です(私は他に何を呼ぶべきかわかりません)。

でも、deferrred antipatternを実装しないでください。 $timeoutはまだあなたがここにする必要があるすべては、チェーンそれらにあり、約束を返します。

groupService.get = function() { 
    return $getMyDataStuffPromise.then(function (data) { 
     return $timeout(function() { 
      return undefined; // maybe data? 
     }, 2000); 
    }); 
}; 
+0

ありがとうございます! – innek

1

さて、この質問の答えは:それは

動作しないので、あなたは、間違ったことに deferred.promiseを割り当てました

$q.defer()を呼び出すと、新しいプロミスオブジェクトが既に生成されていますが、それは$getMyDataStuffPromiseに再割り当てされますが、それ以前に解決することはもちろんです。割り当てを解除するだけです。

確かに、他のポストで示唆されているようにできる限り、約束の反パターンから離れてください。

+0

ありがとうございました!なぜその約束が早すぎるのかを説明した。 – innek

関連する問題