2017-03-10 63 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。$ apply()'之前添加'$ rootScope。$ digest()'。 –

+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/

我希望它能幫助。