Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用jQuery延迟承诺按顺序执行多个任务?_Javascript_Jquery_Node.js_Reactjs_Jquery Deferred - Fatal编程技术网

Javascript 如何使用jQuery延迟承诺按顺序执行多个任务?

Javascript 如何使用jQuery延迟承诺按顺序执行多个任务?,javascript,jquery,node.js,reactjs,jquery-deferred,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 ) { retur

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

尝试使用相同的递归函数

(功能任务(n,完成){
返回n}(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();

那些<>代码>结果< /代码> s真的被使用了吗?你是否考虑过一些基于JavaScript承诺的类库,或者我建议读关于承诺的文章…这太神奇了…这毫无意义。windows.running不作为信号量,循环在运行时将如何休眠?您的代码将退出whiie循环,而任务只运行一次。为什么所有的
Promise.resolve()
语句都是这样?看起来不需要这些。谢谢,应该有用。我更新了代码以删除深度。@jay.m-FYI,这里是StackOverflow,您不应该编辑您的问题以包含部分答案。您可以编辑以澄清您的问题,但您的问题应保留为您的问题。答案是代码中显示解决方案或改进的地方。我的回答是否提供了你需要的信息?谢谢提醒,下次我不会。是的,我对你的答案投了赞成票。你认为问题现在清楚了吗?我不会做同样的事情100次,每次输入和结果都不一样。@jay.m-我的问题回答了你的问题吗?如果是,您可以单击绿色复选标记,向社区表明您的问题已得到回答。如果没有,那么请澄清您还需要什么帮助。@jfriend00这样做了。如果你认为我的问题很清楚,值得你花时间回答的话,请把我的问题投赞成票。非常感谢。