2014-10-17 2 views
0

Мне нужно сделать несколько одновременных вызовов для ресурса с угловым значением и связать некоторые действия с $ apa 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); 
} 

В моем примере я заменил «я» на «с» в крышку, чтобы сделать вещи ясно. Таким образом, непосредственная функция вызывает «i» с ее текущим значением в процессе цикла.

Я не думаю, что есть лучший способ сделать это, поскольку это проблема с javascript.

EDIT:

Как ES6 скоро, вы можете использовать «пусть» ключевое слово для достижения той же цели без упаковки вашего внутреннего цикла в закрытии, потому что «пусть» блок-области видимости переменный.

for (let i = 0; i < 3; i++) { 
    UwgCarrier.get({id: i}).$promise.then(console.log(i);); 
} 
Смежные вопросы