如何使用jQuery延迟的promise来顺序执行许多任务?

时间:2015-11-13 02:42:49

标签: javascript jquery node.js reactjs jquery-deferred

我正在使用供应商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。

3 个答案:

答案 0 :(得分:1)

如果你真的只想反复执行同样的事情,你可以把它放在一个函数中,并在链中的最后一步结束时调用该函数:

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

答案 1 :(得分:0)

尝试使用相同的递归函数

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

答案 2 :(得分:-2)

尝试以下方法:

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