【问题标题】:async-await status resolved but ajax not complete异步等待状态已解决但 ajax 未完成
【发布时间】:2019-07-07 15:30:21
【问题描述】:

我正在等待getJson 呼叫并处理返回的数据。我已经看到了很多答案,并尝试使用$.ajaxasync: false(因为查询是跨域的而不起作用)、回调和.done 基本$.ajax 调用的一部分。现在我正在尝试异步等待。我的代码如下所示:

var ths = getTrailheads(turl);
console.log("trailheads promise");
console.log(ths);
ths.then(function(data) {
  addTrailheadsToMap(data);
});

async function getTrailheads(turl) {
  var result = await $.ajax({
    url: turl,
    datatype: 'json'
  });

  return result;
}

如果 ajax 调用足够快地返回,它有时会起作用,但大多数情况下,控制台日志显示:

这显示了将status 设置为Resolved 的承诺。承诺对象存在,但对象状态显示Processing

这是一个常见的情况,但常见的答案似乎对我不起作用,因此我们将不胜感激。

更新:

  preGetTrailheads(turl);
}
async function preGetTrailheads(turl) {
  var ths = await getTrailheads(turl);
  console.log("trailheads promise");
  console.log(ths);
  addTrailheadsToMap(ths);

}
async function getTrailheads(turl) {
  var result = await $.ajax({
    url: turl,
    datatype: 'json'
  });

  return result;
}

现在我取回对象而不是承诺,但对象仍在“处理中”,然后在我尝试使用它时失败。 object dump

更新 2: 我相信你们两个都是对的,你描述的方式就是你是怎么做的。我在这里有一个密码笔https://codepen.io/mckee80/pen/KJBbvz。它大部分时间都有效。它似乎只在您第一次运行时失败(同样,当它成功时,输出会进入浏览器日志)。我只需要弄清楚为什么它会在我的应用程序上发生。奇怪的是,如果我重新加载页面,它适用于给定的数据集。

【问题讨论】:

  • var ths = getTrailheads(turl); 应该是 var ths = await getTrailheads(turl);。您需要等待异步调用的结果
  • 谢谢。但是当我这样做时,我取回了对象,但状态仍然是“处理中”
  • 你需要一直异步,或者在某个时候使用 promise 模式来处理异步函数完成时的回调
  • 在您的更新中,您在等待then 之前记录了函数的结果(一个承诺)。将您的 console.log 调用移到 then 块内
  • 谢谢。在更新中,它不返回承诺,而是返回对象(因此它不是 thenable)。

标签: javascript ajax promise async-await


【解决方案1】:

您在 getTrailheads 中正确使用了 async/await,但调用它的代码也需要使用 async/await 或以其他方式处理 Promise。假设代码可以是async,您可能只需要在调用之前添加await

var ths = await getTrailheads(turl);

async/await 或多或少是 promise 之上的语法糖,这就是为什么不等待 getTrailheads 的结果返回一个 promise。如果效果更好,您也可以使用getTrailheads(turl).then(ths => {...})

【讨论】:

  • 谢谢。我用我目前的情况更新了这个问题。我取回了对象而不是承诺,但是当我得到它时它仍然不完整。
  • 标记为已接受,因为这是正确的做法。最终,是服务器端的一些零星故障让我绊倒了。感谢您的帮助!
猜你喜欢
  • 2013-03-27
  • 2012-05-04
  • 1970-01-01
  • 1970-01-01
  • 2020-10-04
  • 2019-05-31
  • 1970-01-01
  • 2019-06-16
  • 2018-03-05
相关资源
最近更新 更多