以下是我的演示代码:
doGet('../loaderDemo/1.lst');
doGet('../loaderDemo/2.lst');
doGet('../loaderDemo/3.lst');
doGet('../loaderDemo/4.lst');
doGet('../loaderDemo/5.lst');
function doGet(filename) {
$.get(filename,function (data) {
console.log(data + filename);
});
}
行“console.log(...)”可能不会按照doGet()的顺序执行,输出内容不,顺序为1.lst - > 2.lst - > 3.lst - > 4.lst - > 5.lst。
实际上,输出顺序在每次执行中都是随机的。
我怎么能让它按顺序输出?
感谢您的帮助: - )
-------------更新-------------------
“.lst”文件是我要加载的3D模型。我只是想按顺序加载模型,以便我可以正确地渲染动画。在这种情况下哪个是最好的解决方案?
每个“.lst”文件包含一帧的信息。在本演示中,“console.log()”的输出必须按顺序排列为1.lst - > 2.lst - > 3.lst - > 4.lst - > 5.lst以便我可以处理渲染帧动画。
答案 0 :(得分:1)
jQuery doGet('../loaderDemo/1.lst')
.then(function() {
doGet('../loaderDemo/2.lst');
})
.then(function() {
doGet('../loaderDemo/3.lst');
})
.then(function() {
doGet('../loaderDemo/4.lst');
})
.then(function() {
doGet('../loaderDemo/5.lst');
});
function doGet(filename) {
// added return
return $.get(filename,function (data) {
console.log(data + filename);
});
}
返回Promise(各种)
因此,只需最少的重写,您可以执行以下操作
jQuery.when
但是,如果下载完成的顺序并不重要,那么"处理"的顺序是 - 您可以使用$.when(doGet('../loaderDemo/1.lst'),
doGet('../loaderDemo/2.lst'),
doGet('../loaderDemo/3.lst'),
doGet('../loaderDemo/4.lst'),
doGet('../loaderDemo/5.lst')
)
.done(function(v1, v2, v3, v4, v5) {
[].forEach.call(arguments, function(arg) {}
console.log(arg.data, arg.filename);
})
});
function doGet(filename) {
return $.get(filename)
.then(function(data) {
// need this so we can access the filename and the data for each result
return {
data: data,
filename: filename
};
});
}
来等待"等待"要完成所有下载,请按所需顺序处理结果
from itertools import takewhile, count, islice
def slice_iterable(iterable, chunk):
_it = iter(iterable)
return takewhile(bool, (tuple(islice(_it, chunk)) for _ in count(0)))
for chunk in slice_iterable(it, 32):
print(chunk)
答案 1 :(得分:0)
欢迎来到异步编程的世界。处理此问题的最佳方法是同时调用所有5个异步函数,但延迟执行控制台日志语句直到它们全部完成,然后按顺序运行它们。
(当然,这是假设始终以相同的顺序运行它们非常重要。更好的解决方案可能是重构代码,以便首先完成哪一个无关紧要)
以下是您的问题的示例。
大多数情况下,这比任何发布的顺序解决方案都要快,因为它将同时运行5个调用,而不是一个接一个地调用5个调用。
return $.when(
doGet('../loaderDemo/1.lst'),
doGet('../loaderDemo/2.lst'),
doGet('../loaderDemo/3.lst'),
doGet('../loaderDemo/4.lst'),
doGet('../loaderDemo/5.lst'),
).done( function(res1, res2, res3, res4, res5 ) {
console.log(res1),
console.log(res2),
console.log(res3),
console.log(res4),
console.log(res5),
});
(我以前的编辑使用了$ q,但事实证明jquery有一个内置的东西几乎一样)