所以我一直在使用$ .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的内部包装在函数中。我确信代码可以更高效,但它是一个很好的起点。
答案 0 :(得分:1)
所以最终解决了它。
我必须为“全部完成”输出添加console.log()
....是的...
在$.when()
运行之前,未将promise添加到promise数组中。我将其移至.then()
链接到.getJSON()
。
似乎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