2013-09-26 83 views
0

我不會在其他函數中處理promise,但是在第一次調用回調變量之後不會改變。請幫幫我。看到這裏我的代碼:anjular承諾沒有設置變量

this.handlerLocalDef = function(defer) { 
     var hash = {}; 

     defer.then(
       function(response) { 
        hash = response; 
       }, 

       function(err) { 
        showPopup(err); 
       } 
     ); 

     return hash; 
    }; 



    var initialized = function() { 
     var localRegDef = Localization.getLocalizedDefer('regularform'), 
      localPaymDef = Localization.getLocalizedDefer('payment'); 


      localizeRegForm = self.handlerLocalDef(localRegDef, localizeRegForm); 

      $timeout(function() { 
       console.log("localizeRegForm", localizeRegForm); 
      },5000); 
    }(); 

控制檯日誌返回我localizeRegForm:{}

+0

那麼,如果處理時間超過5秒會發生什麼? – Adam

回答

1

這樣做hash = response你只設置局部變量引用另一個對象。原始返回對象的接收者仍然保留該對象。快速解決方案是做angular.extend(hash,response);。這會將所有respose成員複製到hash引用的對象中,該對象是原始返回的對象。所以接收者會突然看到這些成員。

警告:對於數值(字符串,數字,布爾值,未定義,null)和陣列都不起作用。


這與作品上述建議小提琴:http://jsfiddle.net/sVRCg/3/


但是我得到的feelig整個設置是錯誤的。你怎麼知道hash實際上是用response擴展的?輪詢(例如setTimeout)是一個尷尬的解決方案。我建議你代之以承諾。通過這種方式,您可以準確找出響應何時可用。

另一種方式是ngResource如何做到這一點;這很複雜,請查看代碼。

+0

這是不正確的。接收器不保留「原始」對象。它持有對正確對象的引用,只是在處理該對象時發生,它可能仍然是空的。看看:http://jsfiddle.net/sVRCg/1/ – Adam

+0

我寫的是正確的,也許你不明白。看看更新的小提琴:http://jsfiddle.net/sVRCg/2/,然後我的建議和作品:http://jsfiddle.net/sVRCg/3/ –

+0

你是對的,我沒有請注意OP將hash設置爲響應的事實,而不僅僅是將hash附加到響應中 - 使用extend。 Downvote刪除。 – Adam

0

這不是你如何做異步編程。

您不設置任意超時值,並希望在此時有數據,您必須按照預期方式使用延遲對象並使用回調。這是重構你的代碼的一種方式,以便它能夠工作。根據您的具體情況,它可能會或可能不會達到您的目的:

this.handlerLocalDef = function(defer,callback) { 

     defer.then(
       function(response) { 
        callback.apply(this,[response]) 
       }, 

       function(err) { 
        showPopup(err); 
       } 
     ); 

    }; 



    var initialized = function() { 
     var localRegDef = Localization.getLocalizedDefer('regularform'), 
      localPaymDef = Localization.getLocalizedDefer('payment'); 


      self.handlerLocalDef(localRegDef,function(response) { 
       console.log(response); 
      }); 
    }();