2015-09-16 66 views
1

我已經跑出了處理這種嵌套的回報情況的想法。 我想知道如果數組通過承諾從後端檢索包含數組中的元素。 這工作:封閉回報價值和承諾

function isNameTaken() { 
      var duplicateFound = 0; 
      for (var i = 0; i < $scope.entities.length; i++) { 
       if ($scope.entities[i].name === $scope.myName) { 
        duplicateFound = 1; 
       } 
      } 
     return duplicateFound; 
    } 

我想調整這個所以比較之前的陣列的刷新。我有一個方法來檢索它解析爲一個承諾。現在,我可以將整個事件封裝成一個.then wrap,但是我無法從外部訪問我的duplicateFound變量,以至內部函數的異步本質。

這是我希望得到的工作:

​​

內部件完美的作品作爲承諾解決,但功能作爲一個整體始終解析爲真爲return loadEntities()部分沒有通過我回值我封閉的回報在裏面,但諾言本身。沒有它,它總是會解決錯誤(我認爲它是一個未定義的)。

所以簡而言之。第一個作品。除此方法外,我如何獲得duplicateFound的價值?

回答

2

功能作爲一個整體始終解析爲真

不,它不會返回true。它確實返回一個布爾值的承諾,其中可能滿足true(或與false或完全拒絕)。這個承諾當然是一個真值,所以你不能在if條件下使用它。

相反,您必須調整調用代碼以預測承諾,並讓它在檢查值之前等待分辨率。當然,這會讓你的整個功能(以及所有調用它的功能)異步。

return isNameTaken().then(function(taken) { 
    if (taken) 
     … 
    else 
     … 
}); // yields another promise for the result of the callback 
+0

哇。沒有什麼不可思議的人,我對承諾有一個或兩個認識,曾與量角器工作過,並已經忍受了一些頭痛。你說得對,它沒有考慮修改調用函數,因爲我對返回的工作不正常。 :D – hardcore

+1

由於量角器(茉莉花)'預期'功能自動爲我解決了問題,因此我不習慣將整個思路作爲一個整體進入調用鏈。再次感謝,加上我今天在承諾和嵌套回報方面學到了很多東西,看起來我整個過程都做得很對。 「 – hardcore

+0

」*顯示我整個過程都做得很正確*「 - 確實如此。你做得很好 - 缺少'return's是最常見的錯誤之一:-) – Bergi