1

我試圖創建一個角的js服務,如果需要更新將會從服務器獲取數據,或返回緩存陣列,如果沒有更新。在這兩種情況下,服務應返回promise。服務代碼:緩存服務器響應(AngularJS,延期)

getLikesForMe = function() { 
    var defer = $q.defer(), prom = defer.promise; 

    if (angular.isUndefined(this.likesForMe) || 
     updateStatus.likesForMe === true) { 
     var that = this; 

     prom = $http.get(API_URL + 'likes-to.json') 
     .then(function(result){ 
      updateStatus.likesForMe = false; 
      that.likesForMe = result.data; 
     }); 

    } else { 
     defer.resolve(this.likesForMe); 
    } 

    return prom; 
    } 

電流控制器代碼:

MainUser.getLikesForMe().then(function(result) { 
    $scope.likesList = result; 
}); 

首選控制器代碼:

$scope.likesList = MainUser.getLikesForMe(); 

但是目前我們只有在第二個函數(getLikesForMe())調用工作,第一 - 在列表是空的,「結果」變量是undefined

我是新來的延期對象和我的英語很不好,但我希望你明白的地方的錯誤是。非常感謝!

回答

3

你有2個問題

  • 第一次調用,返回的承諾將與undefined你不是從您的來電$http.get返回從then成功回調事情解決。如果您從該回撥中返回that.likesForMe,我懷疑它會按預期工作。你應該閱讀鏈接承諾。 (無恥插頭:我寫了一個blog post on AngularJS promises它包含了鏈接部分)

  • 的代碼是做什麼的很複雜,你幾乎從來沒有通過$q.defer()創建一個承諾,如果你正在做的有工作現有的承諾。它通常使事情變得更加複雜和難以處理錯誤。您也可以使用$q.when()來創建來自非承諾價值的承諾。所以,我建議使用類似

    getLikesForMe = function() { 
        var that = this; 
        var useCache = !updateStatus.likesForMe && !angular.isUndefined(this.likesForMe); 
    
        return useCache ? $q.when(that.likesForMe) : $http({ 
        method: 'GET', 
        url: API_URL + 'likes-to.json' 
        }).then(function(results) { 
        updateStatus.likesForMe = false; 
        that.likesForMe = results.data; 
        return that.likesForMe; 
        }); 
    }); 
    

你也可以在docs for $http cache讀了,看看您是否能想出一個使用它的解決方案。

+0

偉大的解決方案。非常感謝你! P.S.我肯定會閱讀你的博客文章。 ;) –

0

如果你喜歡控制器代碼的更新版本,那麼你不能返回從服務的承諾。

你可以返回時,你有從HTTP回電將被增強的空對象。

你會那麼必須發出$rootScope.$apply()讓你的控制器通知。