首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >js async/await不工作

js async/await不工作
EN

Stack Overflow用户
提问于 2018-03-01 09:53:49
回答 2查看 4.5K关注 0票数 0

我正在尝试了解异步/等待以及如何使用它们。我遵循了一些我所见过的例子(我想),但是await实际上并不是在等待ajax响应。代码如下:

代码语言:javascript
复制
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关键字实际上并没有等待返回结果。在控制台日志中,我得到了以下内容:

代码语言:javascript
复制
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等待?

谢谢……

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-03-01 09:57:43

async函数返回promises。即使你从异步函数返回一些东西,它也只是promise解析到的值。

您需要这样做才能使用promise:

代码语言:javascript
复制
$(document).ready(function () {
    doAjaxGet( "/static/imeiXref.json")
    .then(json => {
       console.log('json: ', json);
       processJSONData( json );
    })
});

编辑。这是一个有效的代码片段。但是请注意,这是下载json而不是字符串,因此不需要对其进行解析。这确实是一个与异步问题不同的问题,异步问题似乎工作得很好。

代码语言:javascript
复制
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)
}
代码语言:javascript
复制
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

票数 3
EN

Stack Overflow用户

发布于 2018-03-01 09:57:12

所以这里:

代码语言:javascript
复制
$(document).ready(function () {
    let json = doAjaxGet( "/static/imeiXref.json");
    console.log('json: ', json);
    processJSONData( json );
});

您不是在告诉let json等待来自doAjaxGet的响应。它在doAjaxGet函数中等待,但其他一切都是按顺序执行的,不需要等待。

你想做的是这样(我认为):

代码语言:javascript
复制
$(document).ready(async function () {
    let json = await doAjaxGet( "/static/imeiXref.json");
    console.log('json: ', json);
    processJSONData( json );
});

Async/await基本上是围绕promises的语法糖。await等待承诺来解析,因此您必须在使用promise链的每个级别上执行异步/等待,或者您可以只使用标准promise.then()风格的编码。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49041447

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档