JS / jQuery Promise - PullRequest
       4

JS / jQuery Promise

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

Я пытаюсь работать с обещаниями JS, используя jQuery.У меня есть цепочка обещаний, подобных этой:

function myPromisesChain(data)
{
    return $.when(data)
        .then(firstStep)
        .then(secondptStep)
        .then(thirdStep)
        // ...n Step
        .then(finalStep)
        .always(function(data){
            console.log('FINISHED: ' + JSON.stringify(data));
        });
}

Это нормально, но что делать, если мне нужно выполнить шаг в цикле?Печально, но я пока не могу найти правильный синтаксис ... Я ожидаю что-то вроде этого (приблизительно):

    function myPromisesChain(data)
{
    return $.when(data)
        .then(firstStep)
        .then(secondptStep)            
        .then(function(data){
            var counter = 0;
            var limit = 3;
            while(counter<limit){
                  thirdStep(data.transaction[counter]);
                  counter++;
            }
            return data;
        })
        // ...n Step
        .then(finalStep)
        .always(function(data){
            console.log('FINISHED: ' + JSON.stringify(data));
        });
}

Проблема в том, что функция в цикле сама по себе является обещанием.

Ответы [ 2 ]

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

Ваша функция в .then должна возвращать Обещание.Предполагая, что thirdStep действительно возвращает Promise, вы можете добавить его возвращаемые значения в массив по мере использования, а затем использовать Promise.all, чтобы убедиться, что все они разрешены.

.then(function(data) {
    var counter = 0;
    var limit = 3;
    var returns = [];
    while(counter<limit){
        returns.push(thirdStep(data.transaction[counter]));
        counter++;
    }
    return Promise.all(returns);
})
0 голосов
/ 14 февраля 2019

Каждый then метод возвращает новый Promise, вызов then для другого then подразумевает, что вы вызываете второй then для Promise, возвращенного предыдущим then.

Таким образом, вы можете просто сохранить ссылку Promise, возвращенную предыдущим then, и использовать ее, привязав к ней новый then.

IIFE внутри цикла необходим для сохранения ссылки назначение счетчика на момент исполнения

function myPromisesChain(data) {
    var promise = $.when(data)
        .then(firstStep)
        .then(secondptStep);

    var counter = 0;
    var limit = 3;
    while (counter < limit) {
        promise = (function (counter) {
            return promise.then(function(data) {
                return thirdStep(data.transaction[counter]);
            });
        })(counter++);
    }

    return promise
        // ...n Step
        .then(finalStep)
        .always(function (data) {
            console.log('FINISHED: ' + JSON.stringify(data));
        });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...