2013-12-01 6 views
0

Скажем, у меня очень длинный список, где для каждого элемента требуется асинхронный вызов для извлечения. Я хотел бы написать API поверх этого списка, чтобы потребитель мог просто вызвать «next()» или иначе синхронно перебирать список.Итерация над неопределенным массивом отложенных элементов

В идеале я хотел бы иметь что-то, что выглядит следующим образом:

while ((foo = generator.next()) != null) { 
    process(foo); 
} 

Но, я считаю себя спотыкаясь семантикой отсроченных вызовов, и я не знаю, как избежать этого жестко запрограммированного шаблона в общий цикл:

$.when(foo).then(process1AndFetch2) 
    .then(process2AndFetch3) 
    .then(process3AndFetch4) 
    ... 

Предположительно, я мог бы сделать это сам с обратных вызовов

var callback = function() { 
    process(); 
    fetch(callback); 
} 
fetch(callback); 

Но тогда мой стек будет очень глубоким, поэтому я работал отложенным.

Есть ли обычные подозреваемые для превращения такого рода асинхронного поведения в синхронный API?

+0

Посмотрите [здесь] (http://stackoverflow.com/questions/16384841/chain-ajax и-выполнение-его-в-последовательность-JQuery отсроченный/16387812 # 16387812). Вопрос сформулирован по-разному, но мой ответ должен дать вам несколько убедительных подсказок о том, как построить цепочку '.then()' динамически. –

ответ

1

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

Существует общее обещание идиома, чтобы сделать это:

var array = [process1AndFetch2, ...] 

array.reduce(function(a, b) { 
    return a.then(process).then(b); 
}, array.shift()()).then(function(){ 
    //All processed 
}); 

Предполагает JQuery 1.8+

+0

Есть ли место, где можно найти эти общие идиомы обещания? Или обычные javascript/jquery-идиомы? – Sumit

+1

@Sumit bluebird и проекты Q имеют некоторые обещания. https://github.com/kriskowal/q/wiki/Examples-Gallery https://github.com/kriskowal/q#introduction https://github.com/petkaantonov/bluebird#topics – Esailija