按顺序运行多个延迟组

时间:2015-12-17 15:59:08

标签: jquery promise jquery-deferred pouchdb .when

所以我一直在使用$ .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

如果有人能指出我正确的方向,那就太好了。我想我错误地做了$。但是我不知道另一种方式。

再次感谢。

- 编辑:回头看之后,我相信promises数组在交给$ .when时是空的,但现在仍然确定如何解决它。

- edit2:std::string::npos产生下面的输出,但是&#34;全部完成&#34;正在首先展示?它应该是最后一次。

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

- edit3:updated code。我不得不将更新的延迟分配给变量,并将then的内部包装在函数中。我确信代码可以更高效,但它是一个很好的起点。

1 个答案:

答案 0 :(得分:1)

所以最终解决了它。

  1. 我必须为“全部完成”输出添加console.log() ....是的...

  2. $.when()运行之前,未将promise添加到promise数组中。我将其移至.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")})
    }
    
  4. 这将输出以下内容,这是预期的。耶!

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