2014-10-17 37 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);); 
}