【问题标题】:Async/Await + Ajax .done: Returning undefinedAsync/Await + Ajax .done:返回未定义
【发布时间】:2021-10-21 02:24:17
【问题描述】:

对不起,如果这非常简单,我无法理解它。我认为,我见过类似的问题,但没有什么能触及我问题的核心。我有一个简单的异步函数:

async function isOpen() {

    var open;

    var data = $.ajax({
      //Working code here
    });

    data.done(function(dat) {
        var obj = JSON.parse(dat);
        var msg = "";

        for (var i = 0; i < obj.length; i++) {

            let closingDate = Date.parse(obj[i].close);
            let openingDate = Date.parse(obj[i].open);

            if (closingDate > Date.now() && openingDate < Date.now()) {
                open = true;
            } else {
                open = false;
            }
        }
    });

    return open;
}

我知道这段代码都可以正常工作-使用console.log我已经看到open总是成功地分配给true或false。所以我从另一个异步函数调用这个异步函数:

async function testFunction(){

    const open1 = await isOpen();
    //More code here...

}

open1(在testFunction 中)始终未定义——即使我使用await

有什么想法吗?

【问题讨论】:

  • 如果您在返回之前直接对其进行控制台登录,是否打开也是 true 或 false?如果您设置 var open = null; 是否仍然未定义?一开始?
  • return open; 在 ajax 运行之前
  • 另外,for循环会覆盖open的结果,一旦你给open赋值,你就可以打破循环。
  • 使用const dat = await data 后跟您的代码,而不是使用data.done() 回调。 (假设您使用 jQuery 3)。

标签: javascript jquery ajax asynchronous async-await


【解决方案1】:
async function isOpen() {

    var open;

    var data = await $.ajax({
      //Working code here
    });

    var obj = JSON.parse(data);
    var msg = "";

    for (var i = 0; i < obj.length; i++) {

        let closingDate = Date.parse(obj[i].close);
        let openingDate = Date.parse(obj[i].open);

        if (closingDate > Date.now() && openingDate < Date.now()) {
            open = true;
        } else {
            open = false;
        }
    }
    return open;
}

当然open的值会由最后的obj[i]决定

所以你想要

async function isOpen() {
    const data = await $.ajax({
      //Working code here
    });
    const obj = JSON.parse(data);
    let msg = "";

    for (var i = 0; i < obj.length; i++) {

        const closingDate = Date.parse(obj[i].close);
        const openingDate = Date.parse(obj[i].open);

        if (closingDate > Date.now() && openingDate < Date.now()) {
            return true;
        }
    }
    return false;
}

甚至

async function isOpen() {
    const data = await $.ajax({
      //Working code here
    });

    const obj = JSON.parse(data);
    let msg = "";
    return obj.some(({open, close}) => {
        const closingDate = Date.parse(close);
        const openingDate = Date.parse(open);
        const now = Date.now();
        return closingDate > now && openingDate < now();
    });
}

【讨论】:

  • msg 也可以删除。
  • 根据dataType,如果设置为“JSON”,您甚至不需要解析数据。
  • @RaviKThapliyal - 是的,我知道 - 但不会做所有事情:p
  • @ikhvjs - 我怀疑有人使用旧的 jquery
  • @Andy - 不是我的电话...谁知道//Working code here 甚至做了什么
【解决方案2】:

发生这种情况是因为您正在为 ajax 请求使用回调,而不是等待 ajax 请求完成,这将在 isOpen 中设置 open。你可以返回一个 Promise 来解决这个问题,

function isOpen() {
  return new Promise((resolve, reject) => {
    var open;

    var data = $.ajax({
      //Working code here
    });

    data.done(function(dat) {
        var obj = JSON.parse(dat);
        var msg = "";

        for (var i = 0; i < obj.length; i++) {

            let closingDate = Date.parse(obj[i].close);
            let openingDate = Date.parse(obj[i].open);

            if (closingDate > Date.now() && openingDate < Date.now()) {
                open = true;
            } else {
                open = false;
            }
        }
       resolve(open);
    });

  }
}

注意:以上代码需要在回调中处理错误的逻辑,使用reject,否则会永远挂起。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-09
    • 2019-10-05
    • 2020-04-21
    • 1970-01-01
    • 2021-10-05
    • 1970-01-01
    • 2019-06-27
    相关资源
    最近更新 更多