【问题标题】:Loading API requests in order (JavaScript)按顺序加载 API 请求 (JavaScript)
【发布时间】:2019-03-10 01:41:27
【问题描述】:

我正在编写的脚本在 for 循环中进行了几次 API 调用。问题在于,某些 API 调用的加载时间比其他 API 调用长,因此页面上的信息被无序加载。

例如,我将对对象 1-8 进行 API 调用,但它们会按以下顺序加载:4、3、1、2、7、5、6、8

代码基本如下:

function loadData() {
    for (var i = 0; i < 8; i++) {
        $.getJSON("http://theapi.com/data" + i, function(data) {
            var div = "<div>" + data + "</div>";
            browserElement.innerHTML += div;
        });
    }
}

如何强制 JavaScript 在第一个 API 调用完成之前不加载第二个 API 调用?

编辑:使用“promises”链接 API 调用会导致脚本等待显示数据,直到所有数据都加载完毕。这不是一个理想的结果,因为如果有足够的数据,用户可能需要等待几秒钟以上才能看到任何内容。

【问题讨论】:

标签: javascript getjson


【解决方案1】:

在循环中创建所有 div,然后在数据可用时填充数据

function loadData() {
    for (var i = 0; i < 8; i++) {
        let div = document.createElement("div");
        browserElement.innerHTML += div;

        $.getJSON("http://theapi.com/data" + i, function(data) {
            div.innerHTML = data;
        });
    }
}

【讨论】:

  • 或者你可以 Promisify 那个 getJSON 调用,但对于这个例子来说似乎有点过分了:) - 上面应该可以完成这项工作。
  • 这样一个简单的解决方案非常完美。谢谢一百万。
【解决方案2】:

$.getJSON 返回一个 Promise,然后您可以 await 停止执行并获取结果:

async function loadData() {
  for (let i = 0; i < 8; i++) {
    const data = await $.getJSON("http://theapi.com/data" + i);
    const div = "<div>" + data + "</div>";
    browserElement.innerHTML += div;
  }
}

要从连接中挤出整个带宽,您可以并行运行请求,然后一次显示所有 div:

async function loadData() {
  const promises = [];
  for (let i = 0; i < 8; i++) {
    promises.push($.getJSON("http://theapi.com/data" + i));

  const result = await Promise.all(promises);

  for(const data of result) {
    const div = "<div>" + data + "</div>";
    browserElement.innerHTML += div;
  }
}

Read on

【讨论】:

  • Jonas 我喜欢这个关于如何订购 Promises 结果的解决方案。它会保持“显示”任何结果,直到获得所有结果 - 不确定这是否是意图。
  • @milan 也不确定,但这就是为什么我赞成你的回答:)
  • 米兰有一点。虽然它可能有效,但我不确定等到所有数据都被检索到后再显示数据是可取的。
  • @rektroth 好吧,这取决于您的用例。在某些情况下,这种行为是需要的,有些不是。我们向您展示了三种不同的方式来准确地做您想做的事情,选择您喜欢的方式。题外话:虽然你的个人资料显然是讽刺的,但有些人可能会觉得被冒犯了,我建议你将其标记为讽刺或删除它:)
  • @JonasWilms 在高中时创建了该帐户,并且有一段时间没有使用它。完全不知道那里有。谢谢你的警告。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-08
  • 2010-09-06
  • 2011-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-13
相关资源
最近更新 更多