Redgeoff, ваш собственный ответ - это способ, которым я использовал для перевести массив в цепочку цепочек обещаний.
Созданный шаблон de facto выглядит следующим образом:
function doAsyncSeries(arr) {
return arr.reduce(function (promise, item) {
return promise.then(function(result) {
return doSomethingAsync(result, item);
});
}, $q.when(initialValue));
}
//then
var items = ['x', 'y', 'z'];
doAsyncSeries(items).then(...);
Примечания:
.reduce
является необработанным javascript, а не частью библиотеки. result
is предыдущий асинхронный результат / данные и включен для полноты. Начальным result
является initialValue
. Если нет необходимости передавать «результат», то просто оставьте его. $q.when(initialValue)
в зависимости от того, какой обетованный lib вы используете. doSomethingAsync
есть foo
(или что возвращает foo ()?) - в любом случае, функция. Если вы похожи на меня, тогда картина будет выглядеть, на первый взгляд, как непроницаемая клаузула но как только ваш глаз будет настроен, вы начнете рассматривать его как старого друга.
Редактировать
Вот демон , предназначенный для демонстрации того, что шаблон, рекомендованный выше, фактически выполняет свои doSomethingAsync()
вызовы последовательно, а не сразу при создании как указано в комментариях ниже.