我正在尝试了解异步/等待以及如何使用它们。我遵循了一些我所见过的例子(我想),但是await实际上并不是在等待ajax响应。代码如下:
async function doAjaxGet(ajaxurl) {
const result = await $.ajax({
url: ajaxurl,
type: 'GET',
datatype: "text",
});
return result;
}
$(document).ready(function () {
let json = doAjaxGet( "/static/imeiXref.json");
console.log('json: ', json);
processJSONData( json );
});
function processJSONData(data) {
console.log('Data: ', data);
Data = JSON.parse( data);但是await关键字实际上并没有等待返回结果。在控制台日志中,我得到了以下内容:
json: Promise {<pending>}
Data: Promise {<pending>} controller.js:98
jQuery.Deferred exception: Unexpected token o in JSON at position 1 SyntaxError: Unexpected token o in JSON at position 1 jquery.min.js:2
at JSON.parse (<anonymous>)
at processJSONData (http://localhost:3000/js/controller.js:99:25)
at HTMLDocument.<anonymous> (http://localhost:3000/js/controller.js:80:5)
at l (http://localhost:3000/js/jquery.min.js:2:29375)
at c (http://localhost:3000/js/jquery.min.js:2:29677) undefined
jquery.min.js:2 Uncaught SyntaxError: Unexpected token o in JSON at position 1
at JSON.parse (<anonymous>)
at processJSONData (controller.js:99)
at HTMLDocument.<anonymous> (controller.js:80)
at l (jquery.min.js:2)
at c (jquery.min.js:2)但如果我实际查看在控制台中返回的结果,数据实际上就在那里。因此,await函数似乎不是“等待”的,我的代码在ajax调用之后继续执行,它试图解析尚未返回的JSON数据。如何让await等待?
谢谢……
发布于 2018-03-01 09:57:43
async函数返回promises。即使你从异步函数返回一些东西,它也只是promise解析到的值。
您需要这样做才能使用promise:
$(document).ready(function () {
doAjaxGet( "/static/imeiXref.json")
.then(json => {
console.log('json: ', json);
processJSONData( json );
})
});编辑。这是一个有效的代码片段。但是请注意,这是下载json而不是字符串,因此不需要对其进行解析。这确实是一个与异步问题不同的问题,异步问题似乎工作得很好。
async function doAjaxGet(ajaxurl) {
const result = await $.ajax({
url: ajaxurl,
type: 'GET',
});
return result;
}
$(document).ready(function() {
doAjaxGet("https://jsonplaceholder.typicode.com/posts/1")
.then(json => {
console.log('json: ', json);
processJSONData(json);
})
});
function processJSONData(data) {
// NOTE: data is already parsed
console.log('Data: ', data);
console.log("id: ", data.userId)
}<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
发布于 2018-03-01 09:57:12
所以这里:
$(document).ready(function () {
let json = doAjaxGet( "/static/imeiXref.json");
console.log('json: ', json);
processJSONData( json );
});您不是在告诉let json等待来自doAjaxGet的响应。它在doAjaxGet函数中等待,但其他一切都是按顺序执行的,不需要等待。
你想做的是这样(我认为):
$(document).ready(async function () {
let json = await doAjaxGet( "/static/imeiXref.json");
console.log('json: ', json);
processJSONData( json );
});Async/await基本上是围绕promises的语法糖。await等待承诺来解析,因此您必须在使用promise链的每个级别上执行异步/等待,或者您可以只使用标准promise.then()风格的编码。
https://stackoverflow.com/questions/49041447
复制相似问题