2013-06-28 37 views
0

這是Angularjs $http wait for responseangularjs答應將不調用第一次

因爲我無法找到一個解決方案的後續問題,我想我會一直返回一個承諾,讓我的指令做承諾工作.then()函數。

$scope.getVCard = function(id){ 

    var vcardKey = vcardKeyPrefix+id; 

    var vCardFromLS = localStorageService.get(vCardKey); 
    if(vCardFromLS){ 
    var deferred = $q.defer(); 
    deferred.resolve({data:localStorageService.get(vCardKey)}); 
    return deferred.promise; 
    } 
} 

,在我的指導,我使用它作爲

(function(angular, app) { 
    app.directive('popOver',["$window","$http",function($window,$http){ 
    return function(scope,elem,attrs){ 
     elem.on('mouseover',function(){ 
     console.log('mouseover'); 
     var promise = scope.$apply(attrs.popOver); 
     promise.then(function(data){ 
      console.log('promise then called'); 
      console.log(data); 
      //logic here 
     }); 
     console.log('in directive again'); 
     console.log(data); 
     }); 
    }; 
    }]); 
})(angular, app); 

但promise.then()是沒有得到調用上的第一次。它被調用,並在隨後的鼠標懸停工作正常。可能是什麼問題?

我試着在return deferred.promise之前添加$ scope。$ apply(),但我正在申請已經進行中的錯誤。我在這裏錯過了什麼?

+0

如果'vCardFromLS'發現你只返回一個承諾。你確定它一直存在嗎? – robertklep

+0

是啊......它總是在那裏。實際上,如果找不到該項目,我會觸發$ http請求。 –

+0

我想你使用'scope。$ apply'混淆了Angular。 [Here](http://plnkr.co/edit/ASlH0io9QGuObUVWz5CC?p=preview)是一個輕微的重寫版本,似乎工作正常。 – robertklep

回答

1

我相信這是因爲你在返回之前解決它。但我可能是錯的。

試試這個:

$scope.getVCard = function(id){ 
    var vcardKey = vcardKeyPrefix+id, 
    vCardFromLS = localStorageService.get(vCardKey), 
    deferred = $q.defer(); 
    if(vCardFromLS){ 
    $timeout(function(){ 
     deferred.resolve({data:vCardFromLS}); 
    }, 100); 
    } else { 
    $timeout(function(){ 
     deferred.reject(); 
    }, 100); 
    } 
    return deferred.promise; 
} 
+1

在返回/使用其承諾之前解決延期問題不成問題。 – robertklep

相關問題