运行 多个延迟组顺序
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 的内部包装在一个函数中。我确信代码可以更高效,但这是一个很好的起点。
所以终于解决了。
我实际上必须为 "All Complete" 输出添加一个 console.log()
.... 是的...
在 $.when()
为 运行 之前,未将承诺添加到承诺数组中。我把它移到链接到 .getJSON()
的 .then()
中。
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
所以我一直在摆弄 $.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 的内部包装在一个函数中。我确信代码可以更高效,但这是一个很好的起点。
所以终于解决了。
我实际上必须为 "All Complete" 输出添加一个
console.log()
.... 是的...在
$.when()
为 运行 之前,未将承诺添加到承诺数组中。我把它移到链接到.getJSON()
的.then()
中。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