Как использовать отложенное обещание jQuery для последовательного выполнения многих задач?

Я использую API поставщика для доступа к его услугам. Сервис представлен как отложенный объект jQuery. Для одной полной бизнес-задачи я делаю что-то подобное в псевдокоде.

service.do('reset').then( function ( result) {
    return service.setValue(valObj);
}).then ( function (result) {
    return service.do('runTask');
}).then ( function ( result ) {
    return service.getResult(query);
}).then ( function (result){
    console.log('finally done with One task');
});

Каждый service.XXX - это вызов API REST, функция обратного вызова возвращает ответ REST. Я опускаю, как каждый результат используется для простоты.

Теперь мне нужно выполнить этот сервис 100 раз в строгой последовательной последовательности в одной бизнес-задаче. Вышеупомянутый код должен быть выполнен 100 раз: предыдущий завершен, затем начните следующий.

Каков хороший способ структурировать такое требование в javascript? Я использую ReactJS и JQuery.

3 ответа

Решение

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

var cntr = 0;
function run() {
    if (cntr++ > 1000) return;
    service.do('reset').then( function ( result) {
        service.setValue(valObj).then ( function (result) {
            service.do('runTask').then ( function ( result ) {
                service.getResult(query).then ( function (result){
                    console.log('finally done with One task');
                    run();
                });
            });
        });
    });
}

run();

К вашему сведению, вам не нужно так глубоко вкладывать вещи. Вы можете связать свои обещания так:

var cntr = 0;
function run() {
    if (cntr++ > 1000) return;
    service.do('reset').then( function ( result) {
        return service.setValue(valObj);
    }).then ( function (result) {
        return service.do('runTask');
    }).then ( function ( result ) {
        return service.getResult(query);
    }).then ( function (result){
        console.log('finally done with One task');
        run();
    });
}

run();

Попробуйте использовать ту же рекурсивную функцию

(function tasks(n, complete) {
    return n < complete ? Promise.resolve("a").then(function(result) {
        return Promise.resolve(result + "b").then(function(result) {
            return Promise.resolve(result + "c").then(function(result) {
                return Promise.resolve(result + "d").then(function(result) {
                    console.log("finally done with " + n + " task", result + "" + n);
                }).then(tasks.bind(null, n+1, complete));
            });
        });
    }) : console.log("complete", n, complete)
}(0, 100))

Попробуйте следующее:

var i = 100;
window.running = false;

while (i > 0 && !window.running) {
    window.running = true;
    i--;

    service.do('reset').then( function ( result) {
        service.setValue(valObj).then ( function (result) {
            service.do('runTask').then ( function ( result ) {
                service.getResult(query).then ( function (result){
                    //...

                    window.running = false;
                });
            });
        });
    });
}
Другие вопросы по тегам