2015-05-05 3 views
0

У меня возникли странные проблемы с синхронизацией с использованием асинхронных вызовов с использованием углового.Проблемы с синхронизацией с угловыми асинхронными вызовами

У меня есть массив идентификаторов:

set = [1,2] 

I цикл по этому набору и сделать вызов асинхронной для каждого ID:

promises = [] 
for id in set 
    d = $q.defer() 
    promises.push d.promise 
    mySvc.asyncGetObject id 
    .then (results) -> 
    console.log results, id 
    # results doesnt correspond with the ID 

В .then() блока, когда я ожидал для получения id == 2 объекта, я фактически получаю объект id == 1. Я проследил это тщательно, и это не имеет никакого смысла. Я посмотрел на сетевую панель - HTTP-вызов выполнен правильно. Результаты, которые я получаю от вызова, не совпадают с результатами, которые я получаю в коде.

Что может быть причиной этого? У меня была проблема в прошлом, когда я пытался обновить несколько элементов HTML, и мне пришлось обернуть один или два вызова в setTimeout, иначе они не будут выполняться. Я не знаю, связано ли это, но это расстраивает.

+0

Это пахнет отсроченный антишаблон мне. –

+0

Пожалуйста, объясните. –

+0

stackoverflow.com/questions/23803743/what-is-the-deferred-antipattern-and-how-do-i-avoid-it –

ответ

1

Кольцевые тела (в CoffeeScript или JavaScript) не являются замыканиями, поэтому при выполнении асинхронного обратного вызова id будет иметь значение последнего элемента в set.

Описание: good article about this.

В вашем примере, то вдоль этих линий должны сделать это:

promises = [] 
for id in set 
    d = $q.defer() 
    promises.push d.promise 
    do(id) 
    mySvc.asyncGetObject id 
     .then (results) -> 
     console.log results, id 
    , id 
+0

Спасибо. Это заставило меня затаиться. –

Смежные вопросы