2015-12-17 4 views
0

Так что я возился с $ .Deferred() и не мог заставить его работать так, как я хочу.Выполнение нескольких отложенных групп последовательно

Идея заключается в том, чтобы запустить группу из 10 пунктов, ждать его, чтобы закончить, запустите следующую группу, дождитесь ее завершения и т.д.

Приведенный ниже код этот выход

(3)Item Complete 
(30)Item Finished 

.

indexedDB.deleteDatabase("_pouch_test") 
db = new PouchDB('test'); 

function item(limit){ 
    var d = $.Deferred(); 
    var promises = [] 
    var url = ""//url that will respond with up to limit responces 
    $.getJSON(url,function(data){ 
     $.each(data.items,function(i, item){ 
       promises.push(db.post({item:"test"}).then(console.log("Item Finished "))) 
     }) 
    }).fail(function(jqxhr, textStatus, error) { 
     var err = textStatus + ", " + error; 
     console.log("Request Failed: " + err); 
    }); 
    return $.when.apply($,promises).promise() 
} 

function group(times){ 
    var d = $.Deferred().resolve() 
    for(var i=0; i<times; i++){ 
     d.then(item(10).then(function(){console.log("Group Complete")})) 
    } 
    return d.promise() 
} 

function init(){ 
    group(3).then("All Complete") 
} 

Что я ожидаю выводится как

(10)Item Finished 
Group Complete 
(10)Item Finished 
Group Complete 
(10)Item Finished 
Group Complete 
All Complete 

Если кто-то может мне точку в правильном направлении, что было бы здорово. Я думаю, что я делаю $ .when неправильно, но не знаю другого пути.

Еще раз спасибо.

--edit: Оглядываясь назад, я считаю, что массив обещаний пуст, когда ему передают $ .when, все еще теперь уверен, как его исправить.

--edit2: updated code производит выходные данные ниже, но сначала отображается «Все полное»? Это должно быть последним.

All Complete 
(10)Item finished 
Group Finished 
(10)Item finished 
Group Finished 
(10)Item finished 
Group Finished 

-edit3: So I solved it. Мне пришлось назначить обновленную отложенную переменную, а также обернуть внутреннюю часть тогда в функции. Я уверен, что код может быть более эффективным, но это отличная отправная точка.

+0

Это действительно сбивает с толку, но я думаю, что вы ищете что-то вроде этого -> https://jsfiddle.net/16s71q12/1/ – adeneo

+0

@adeneo Что-то там меня думать о решении к пустые обещания в $ .when проблема. проверьте edit2. – MTNewton

+0

Вы хотите запускать элементы * в * каждой группе из 10 последовательно или параллельно? Я знаю, что вы хотите, чтобы группы были в последовательности. –

ответ

1

Так получилось, что решил.

  1. Я должен был на самом деле добавить console.log() для «All Complete» выход .... да ...

  2. Обещания не были добавлены в массив обещание перед $.when() был запущен. Я переместил его в .then(), прикованный к .getJSON().

  3. Кажется, функция group() была решена, прежде чем она была на самом деле. Мне пришлось установить отложенный объект на измененный (d = d.then()), а также включить внутри функции .then() в функцию.

    indexedDB.deleteDatabase("_pouch_test"); 
    db = new PouchDB('test'); 
    
    function item(limit){ 
        var promises = []; 
        var url = ""; //url to respond with up to limit responces 
        var j = $.getJSON(url) 
         .fail(function(jqxhr, textStatus, error) { 
          var err = textStatus + ", " + error; 
          console.log("Request Failed: " + err); 
         }) 
         .then(function(data){ 
          var promises=[] 
          $.each(data.items,function(i, item){ 
            promises.push(db.post({item:"test"}).then(console.log("Item Finished "))); 
          }); 
          return $.when.apply($,promises) 
         }).then(function(){ 
          console.log("Group Complete") 
         }) 
         return j; 
    } 
    
    function group(times){ 
        var d = $.Deferred().resolve() 
        for(var i=0; i<times; i++){ 
         d = d.then(function(){return item(10)}) 
        } 
        return d.promise() 
    } 
    
    function init(){ 
        group(3).done(function(){console.log("All Complete")}) 
    } 
    

Это выводит следующее, который, как предполагалось. Ура!

(10)Item Finished 
Group Finished 
(10)Item Finished 
Group Finished 
(10)Item Finished 
Group Finished 
All Complete 
Смежные вопросы