如何使用 jQuery deferred promise 顺序执行多个任务?

How to use jQuery deferred promise to execute many tasks sequentially?

我正在使用供应商 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下面是一个REST API调用,回调函数带回REST响应。为了简单起见,我省略了每个结果的使用方式。

现在我需要在单个业务任务中以严格的端到开始顺序执行此服务 100 次。上面的代码需要执行100次:上一个执行完再开始下一个

在 javascript 中构建此类需求的好方法是什么?我正在使用 ReactJS,并且 jQuery。

尝试以下操作:

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;
                });
            });
        });
    });
}

尝试使用相同的递归函数

(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 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();