【问题标题】:AngularJS multiple concurrent chained $resource callsAngularJS 多个并发链式 $resource 调用
【发布时间】:2014-10-17 00:06:47
【问题描述】:

我需要对 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) );
}

为什么第一个代码 sn -p 返回 "2, 2, 2" ?

有没有更简洁的方法来解决这个问题?

【问题讨论】:

    标签: angularjs angular-resource angular-promise


    【解决方案1】:

    这是关闭的问题。只需将您的封盖包裹在另一个封盖中即可。

    您可以通过调用立即函数来解决问题,如下所示:

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

    在我的示例中,我在闭包中将“i”替换为“c”以使事情更清楚。像这样,立即函数在循环过程中使用其当前值调用“i”。

    我认为没有更好的方法来做到这一点,因为这是一个 javascript 问题。

    编辑:

    由于 ES6 即将推出,您可以使用“let”关键字来实现相同的目标,而无需将内部循环包装在闭包中,因为“let”是块范围的变量。

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

    【讨论】:

      猜你喜欢
      • 2014-08-18
      • 2015-12-24
      • 2014-08-19
      • 1970-01-01
      • 1970-01-01
      • 2016-06-12
      • 2015-08-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多