Promises.all () прерывая последовательную цепочку - PullRequest
0 голосов
/ 07 февраля 2019

Раньше я использовал отложенные / обещания 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.

Хорошо знать, что мой начальный шаблон должен работать - если я согласен с тем, с какой асинхронной обработкой я работаю.

1 Ответ

0 голосов
/ 07 февраля 2019

Измените это:

Promises.all(promises)

на следующее:

Promise.all(promises)

Имеется исключение (поскольку не определено Promises, которое перехватывается .then()и затем отклоняет цепочку обещаний.

Это классическая причина, по которой у вас всегда должен быть .catch() в конце цепочки, потому что, если вы регистрируете это отклонение, оно, вероятно, сообщит вам, в чем ошибкаwas.


Если вы хотите преобразовать любые обещания jQuery в обещания ES6, чтобы вы могли использовать .catch() где угодно или просто для обеспечения согласованного поведения, вы можете заключить их в Promise.resolve(), как в:

       Promise.resolve(firstNetworkCall()).then(...).catch(...)

или это:

       var promises = data.map(function(item) {
            // All of these calls (happens to be 6)
            // need to be done before I continue
            return Promise.resolve(thirdIndependentCall(item.Info));
        });

        // at this point I see [Promise, Promise, ....]
        // all are unresolved

        return Promise.all(promises);

И имейте в виду, что некоторые новые версии jQuery более совместимы с обещаниями ES6, чем другие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...