【问题标题】:How to use jQuery deferred promise to execute many tasks sequentially?如何使用 jQuery 延迟承诺顺序执行许多任务?
【发布时间】:2015-11-13 21:23:37
【问题描述】:

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

【问题讨论】:

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


【解决方案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();

【讨论】:

  • 谢谢,应该可以了。我更新了代码以删除深度。
  • @jay.m - 仅供参考,在 StackOverflow 上,您不应该编辑您的问题以合并部分答案。您可以编辑以澄清您的问题,但您的问题应该仍然是您的问题。答案是显示代码中的解决方案或改进的地方。我的回答是否为您提供了所需的信息?
  • 谢谢提醒,下次不会了。是的,我投票赞成你的答案。你认为问题现在清楚了吗?而且我不会做同样的事情 100 次,每次输入和结果都不同。
  • @jay.m - 我的问题能回答你的问题吗?如果是这样,您可以单击绿色复选标记以向社区表明您的问题已得到解答。如果没有,请说明您还需要什么帮助。
  • @jfriend00 做到了。如果您认为我的问题很清楚并且值得您花时间回答,请投票支持我的问题。谢谢。
【解决方案2】:

尝试使用相同的递归函数

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

【讨论】:

  • 为什么所有Promise.resolve() 声明?似乎不需要这些。
【解决方案3】:

尝试以下方法:

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

【讨论】:

  • 这毫无意义。
  • windows.running 不如信号量,循环如何在运行时休眠?您的代码将退出 whiie 循环,并且该任务仅运行一次。
猜你喜欢
  • 2015-12-23
  • 1970-01-01
  • 2019-05-30
  • 2015-03-27
  • 2023-03-21
  • 1970-01-01
  • 2017-11-29
  • 2016-12-01
相关资源
最近更新 更多