2014-10-17 39 views
0

我需要對Angular資源進行多個併發調用,並使用$ promise api鏈接一些操作。

我這樣定義

myServicesModule.factory('MyResource', ['$resource', 'SETTINGS', function($resource, SETTINGS) { 
    return $resource(SETTINGS.serverUrl + '/myResource/:id', { }, 
     { 
      get: { method: "get", url: SETTINGS.serverUrl + '/myResource/show/:id' }, 
     } 
    ); 
}]); 

我的控制器的資源需要檢索多條記錄,而當記錄是準備採取每一個行動。我無法將值傳遞給then()閉包。

當我這樣做:

for (var i = 0; i < 3; i++) { 
    MyResource.get({id: i}).$promise.then(function(item) { console.log(i); });    
} 

輸出爲 「2,2,2」。

此代碼導致所需的「0,1,2」輸出(順序因各個資源調用何時完成而不同),但這是一個難以解決的問題。

for (var i = 0; i < 3; i++) { 
    var closure = function(i) { 
     return function(item) { console.log(i); console.log(item); } 
    } 
    UwgCarrier.get({id: i}).$promise.then(closure(i)); 
} 

爲什麼第一個代碼段返回「2,2,2」?

有沒有更簡單的方法來解決這個問題?

回答

1

這是關閉的問題。只需將你的封閉包裹在另一個封套中

你可以用一個直接的函數調用的解決辦法,這將是這樣的:

for (var i = 0; i < 3; i++) { 
    (function(c) { 
     UwgCarrier.get({id: c}).$promise.then(console.log(c);); 
    })(i); 
} 

在我的例子中,我已經取代了「我」的「C」到封蓋把事情說清楚。就像這樣,立即函數在循環過程中調用「i」及其當前值。

我不認爲有更好的方法來做到這一點,因爲它是一個JavaScript的關注。

編輯:

由於ES6快到了,你可以用「讓」關鍵字來達到同樣的目標而不用包裹在一個封閉的內部循環,因爲「讓」塊作用域的變量。

for (let i = 0; i < 3; i++) { 
    UwgCarrier.get({id: i}).$promise.then(console.log(i);); 
}