javascript $ .get()函数执行时间

时间:2016-08-11 06:23:29

标签: javascript

以下是我的演示代码:

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以便我可以处理渲染帧动画。

2 个答案:

答案 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有一个内置的东西几乎一样)