Раньше я использовал отложенные / обещания jQuery, но я пытаюсь перейти к обещаниям JavaScript.У меня есть функция, которая должна выполнить несколько сетевых вызовов последовательно, а затем несколько, которые могут произойти в любом порядке, но все необходимо решить, прежде чем двигаться вперед.Я начинаю с последовательных вызовов, и они идут по порядку, но затем с результатами второго вызова мне нужно перебрать эти результаты и сделать переменное число (на данный момент 6) дальнейших вызовов.Мне все равно, в каком порядке они выполняются, но нужно подождать, пока все они решатся, прежде чем я продолжу.Я думал, что этот шаблон будет работать.Но это не так.
function doLotsOfStuff(){
firstNetworkCall()
.then(function(data){
// do stuff with data
return secondNetworkCall();
})
.then(function(data){
// do stuff with data
var promises = data.map(function(item){
// All of these calls (happens to be 6)
// need to be done before I continue
return thirdIndependentCall(item.Info);
});
// at this point I see [Promise, Promise, ....]
// all are unresolved
return Promise.all(promises);
})
.then(function(results){
// executes immediately after the Promises.all() line
// none of them are resolved
// results is just one unresolved promise
});
}
Я могу заключить последний шаг в Promises.all () следующим образом:
return Promise.all(promises)
.then(function(results){
// this works!
})
Но если я захочу связать больше вещей после этого, яЯ должен продолжать их вмешиваться. Кажется, мне не хватает какой-то информации.
РЕДАКТИРОВАТЬ
Я скопировал опечатку в моем упрощенном коде, которого нет в моем реальном коде.Предложение добавить .catch()
в мою цепочку было хорошим, и я попробовал его.Теперь он выдает firstNetworkCall(...).then(...).then(...).catch is not a function.
Я думаю, проблема в том, что часть моего кода (где-то) все еще полагается на jQuery.Deffered
, и это не очень хорошо работает с Promise.
Хорошо знать, что мой начальный шаблон должен работать - если я согласен с тем, с какой асинхронной обработкой я работаю.