我正在编写一个脚本来进行异步调用以获取一堆数组数据(约50,000个项目),使用requestanimationframe()多次迭代该数据,然后进行另一次调用并迭代这些结果,几个次。
我希望在完成与前一批次的requestanimationframe循环后,尽快开始迭代后续调用中的数据。我想要的是在第一批处理时对下一批进行异步调用,然后只要1)该调用返回并且2)requestanimationframe()迭代完成,就开始处理下一批
我正在使用jquery。如果我在等待2个ajax调用,我会使用$ .when()和done()。但我的第二个条件不是ajax回归。我希望避免像第二个条件满足后用第二个条件检查setInterval()的东西。
现在我的代码是这样的:
function doIt(value){
$.get("bunch/of/data.php", {param:value}, function(data){
var t;
var tt = 0;
function process(){
if(tt < 3000) {
requestAnimationFrame(process)
}
var now = new Date().getTime();
tt += (now - (t || now)); // + ms since last frame called
t = now;
//...do a bunch of stuff with data
if(tt >= 3000){
doIt(newValue)
}
}
process();
}
}
这会导致等待数据调用,然后使用它进行处理,然后等待下一次数据调用等。
答案 0 :(得分:1)
显然没有经过测试,但我相信这段代码会起作用
使用jQuery AJAX调用返回promise的事实,这可以通过以下方式实现
feature2
使用ONLY jQuery的相同代码(即不需要在Internet爆炸中支持任何Promise)
var go = function go(initialValue) {
return new Promise(function (resolve, reject) {
var doIt = function doIt(value, data) {
var p = void 0;
if (value !== initialValue) {
p = new Promise(function (resolve, reject) {
var started = 0;
function process(ms) {
started = started || ms;
var elapsed = ms - started;
var done = elapsed >= 3000;
if (done) {
return resolve();
}
// do stuff with data
requestAnimationFrame(process);
}
process(0);
});
} else {
p = Promise.resolve();
}
if (value > 0) {
$.ajax("bunch/of/data.php", { param: value })
.then(function (data) {
return p.then(function () {
return doIt(value - 50000, data);
});
});
} else {
resolve();
}
};
doIt(initialValue);
});
};
go(123593)
.then(function() {
console.log('all done');
});