2015-11-13 2 views
0

Я использую API-интерфейс поставщика для доступа к его услугам. Служба отображается как объект отложенных объектов jQuery. Для одной полной бизнес-задачи я делаю что-то подобное в псевдокоде.Как использовать 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.

+1

Получили ли эти результаты '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' – fuyushimoya

+1

Вы рассмотрели некоторую библиотеку, основанную на javascript, такую ​​как https://github.com/kriskowal/q или https://github.com/petkaantonov/bluebird –

+1

Предлагаю прочитать эту статью о обещаниях. http://pouchdb.com/2015/05/18/we-have-a-problem-with-promises.html. Это потрясающе ... – IonicBurger

ответ

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

FYI, вы не должны так глубоко гнездятся вещи. Вы можете связать свои обещания следующим образом:

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

Спасибо, он должен работать. Я обновил код, чтобы удалить глубину. –

+0

@ jay.m - FYI, здесь, в StackOverflow, вы не должны редактировать свой вопрос, чтобы включить часть ответа. Вы можете отредактировать, чтобы уточнить свой вопрос, но ваш вопрос должен оставаться вашим вопросом. Ответы показывают, где отображаются решения или улучшения кода. Получил ли мой ответ информацию, которая вам нужна? – jfriend00

+0

THX для напоминания, в следующий раз я не буду. Да, я проголосовал за ваш ответ. Как вы думаете, теперь вопрос ясен? И я не делаю этого 100 раз, каждый раз, когда входы и результат разные. –

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

Это не имеет никакого смысла. – Bergi

+0

windows.running не как семафор, как цикл будет спать при запуске? Ваш код выйдет из цикла whiie, и задача будет выполняться только один раз. –

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

+0

Почему все операторы 'Promise.resolve()'? Кажется, что это не нужно. – jfriend00

Смежные вопросы