2017-03-10 7 views
0

thenの約束のコールバックが呼び出されない理由は何ですか?たとえば :私は何かを明らかに見ていない

function testPromise() { 
    console.log("this gets logged") 
    return $q(function(resolve, reject) { 
    console.log("this too") 
    resolve("test") 
    console.log("and this"); 
    $rootScope.$apply() 
    console.log("and this too"); 
    }) 
} 
testPromise().then(function(result){ 
    console.log("this never gets logged") 
}); 

アム?ありがとうございました。

+1

私は思っていますが**あなたの特定の問題はreturn文の前にではなく、 '$ rootScope。$ apply()'を呼び出してから追加ダイジェスト。 '$ rootScope。$ digest()'を '$ rootScope。$ apply()'の直前に追加してみてください。 –

+1

'$ q'は解決/拒否のスコープダイジェストをすべてトリガーします。手動で追加する必要はありません – Phil

+0

私はPhilに同意します。実際に何らかの理由で私の例で$ apply()を呼び出す際に問題がありました。 – moplin

答えて

0

ご回答いただきありがとうございます。それが判明し、あなたの何人かが私がこの機能をどこから呼んでいたかと関係していると言われました。したがって、通常の関数からの呼び出しが機能します。 thenのコールバックからの呼び出しも機能しましたが、context.sync().then()からの呼び出しはcontext.sync()で、Word Add-inの約束です(実際に何を知っているのか)。だから私はコールバックを取るように私の関数を変換することになった、むしろ約束である。

0

これは、使用しているAngularJSのバージョンによって異なります。

AngularJS 1.2 $q was not a functionでは、「遅延」と呼ばれるものを作成し、別途約束を返す必要がありました。

ただし、この場合、コンソールにエラーが表示されます。

0

すべては、$rootScope.$apply()からどこに電話しているかによって異なります。ダイジェストサイクルの実行期間中は、エラーが発生し、スクリプトの実行が停止します。

あなたの例は$rootScope.$apply()なしで完全に動作します。どのように使用しようとしていたかについて、より多くの文脈を提供できますか?

0

こちらがお役に立てば幸いです。 $ qを使っていると思います。 私は実際の例を作りました。

私の例では、サービス内で$ qを使用し、$ timeoutでその応答を遅らせます。 $ apply()を削除しました。なぜそれを使用しているのかわかりません。

app.factory('TestingService', TestingService); 
    function TestingService($q, $timeout) { 
    return {runPromise:runPromise}; 
    function runPromise() { 
     return $q(function(resolve, reject) { 
      console.log("inside my $q") 
      $timeout(function(){ 
      resolve("$q is working fine"); 
      }, 2000); //Lets use $timeout, just to see the result 
     }); 
    }; 
    } 

、その後

TestingService.runPromise().then(
    function(result){ 
    console.log('result::',result); 
    vm.test = result; 
}); 

https://jsfiddle.net/moplin/r0vda86d/

私はそれが役に立てば幸い。

関連する問題