2015-10-06 72 views
0

hmmm,我在這一段時間內陷入困境,希望我能從你們那裏得到一些提示。角度js代碼in .then函數在承諾完成前執行

我把一些示例代碼在這裏來說明這個問題: http://jsfiddle.net/HB7LU/18216/

所以基本上,我的console.log期待(「出把會員數據」 +號);每當我點擊成員項目時,mySvc.get()休息調用完成後立即執行。

$q.all([ 
    mySvc.get({id: number}) 
]).then(function() { 
    console.log('out put data for member ' + number); 
}); 

但事實並非如此,它只能在第一次點擊時按預期工作。第二次點擊它時,會發生相反的情況。

XHR finished loading: GET "http://fiddle.jshell.net/HB7LU/18216/show/test?id=1" 
(index):53 loading data - rest call finished 
(index):68 out put data for member 1 <- this is correct 
(index):68 out put data for member 2 <- this is wrong, should wait till rest call finishes 
XHR finished loading: GET "http://fiddle.jshell.net/HB7LU/18216/show/test?id=2 
(index):53 loading data - rest call finished 

ps:我在鉻中測試它。沒有在其他瀏覽器測試過它

請讓我知道我可以修復它。謝謝!

+0

你可以添加mySvc.get的代碼嗎? mySvc.get()是否返回一個承諾? $ q.all()傳遞一個$ q.promises數組。所以,如果您沒有從.get()返回承諾,那麼它將無法工作。請展示。 – frosty

回答

0

您正在返回每次相同推遲而不是創建一個新的,如果你感動的get調用內部的推遲創建或剛剛返回從$ HTTP承諾稱它工作正常

myService.get = function(requestParams) { 
    var deffered = $q.defer(); 

http://jsfiddle.net/jc04arnn/

+0

aw ...錯過了...謝謝!它完美的作品! – innek

0

您需要在每次調用.get()時創建一個新的延遲。查看更正的代碼。因爲你只能解決延期一次,你多次解決它沒有事件。它只是第一次解決它。之後,任何時候它返回的承諾,它會立即開火。因此,延期已經解決。

myService.get = function(){ 
    var deffered = $q.defer(); 

http://jsfiddle.net/8qLrnz5o/

+0

感謝您的回答!自shaunhusain首先回答,所以我選擇他的答案作爲最佳答案。謝謝你! – innek

0

其他的解決辦法是返回的$ HTTP創建承諾(先放回調,然後返回承諾):

myService.get = function(requestParams) { 
    var call = $http({ 
     method: 'GET', 
     url: TEST_DATA_URLS, 
     params: requestParams 
    }); 

    call.success(function (msg) { 
     console.log('loading data - rest call finished'); 
    }); 

    return call; 
}; 

,當你調用mySvs.get你有相同承諾:

mySvc 
    .get({id: number}) 
    .then(function() { 
      console.log('out put data for member ' + number); 
     }); 

這是小提琴: http://jsfiddle.net/tmbs0b1L/