运行 多个延迟组顺序

Running multiple deferred groups sequentially

所以我一直在摆弄 $.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: 回过头来看,我相信 promises 数组在传递给 $.when 时是空的,但现在仍然确定如何修复它。

--edit2: updated code 产生下面的输出,但是 "All complete" 首先显示?应该是最后一个。

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

--edit3:So I solved it。我必须将更新后的延迟分配给变量,并将 then 的内部包装在一个函数中。我确信代码可以更高效,但这是一个很好的起点。

所以终于解决了。

  1. 我实际上必须为 "All Complete" 输出添加一个 console.log().... 是的...

  2. $.when() 为 运行 之前,未将承诺添加到承诺数组中。我把它移到链接到 .getJSON().then() 中。

  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