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