【发布时间】:2019-07-07 15:30:21
【问题描述】:
我正在等待getJson 呼叫并处理返回的数据。我已经看到了很多答案,并尝试使用$.ajax 的async: 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