Как использовать отложенное обещание jQuery для последовательного выполнения многих задач?
Я использую 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 - это вызов API REST, функция обратного вызова возвращает ответ REST. Я опускаю, как каждый результат используется для простоты.
Теперь мне нужно выполнить этот сервис 100 раз в строгой последовательной последовательности в одной бизнес-задаче. Вышеупомянутый код должен быть выполнен 100 раз: предыдущий завершен, затем начните следующий.
Каков хороший способ структурировать такое требование в javascript? Я использую ReactJS и JQuery.
3 ответа
Если вы действительно хотите выполнять одно и то же снова и снова, вы можете просто поместить его в функцию и вызвать эту функцию, когда завершится последний шаг в цепочке:
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();
Попробуйте использовать ту же рекурсивную функцию
(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 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;
});
});
});
});
}