为什么在这种情况下Javascript异步等待无法正常工作?

时间:2019-05-17 20:36:29

标签: javascript flask

我是Java的新手,还没有办法让我的代码在执行下一步之前等待一些结果。我对回调进行了一些研究,但似乎无法使其与我的代码一起使用。

我正在使用Flask框架来开发网页。以下代码调用端点之一以获取JSON响应(name是我发送给端点的参数,data是我返回的JSON响应):

$.getJSON('/if_name_exists', {
    name: "sample_name",
}, function(data) {
    if (data.check == "True") {
        alert("Name already exists! Please enter another name.");
        return false;
    }
});

问题在于Javascript不等待此响应,而是执行程序中的后续步骤。这就是我尝试过的-

$.getJSON('/if_name_exists', {
    name: "sample_name",
}, function(data) {
    if (data.check == "True") {
        alert("Name already exists! Please enter another name.");
        return false;
    }
});

(async () => { await wait(2000); console.warn('done') })();

但是我的代码仍然不等待响应,而是执行后续步骤。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

简短回答

带有承诺或回调。

您似乎正在尝试创建一个异步函数,该函数正在等待ajax请求的响应/错误。

有关工作示例,请参见下文,定义了2个函数,其中一个是使请求“ makeRequest”的函数,这将返回一个Promise,它可以解决您的网络请求成功或失败的时间。

第二个函数是调用发出请求的函数的函数,在这里您将看到我放置了一个try / catch示例。

这似乎就是你所追求的。

const makeRequest = async () => {
    return new Promise((resolve, reject) => {

        $.getJSON('/if_name_exists', {
            name: "sample_name",
        }, function(data) {
            if (data.check == "True") {
                alert("Name already exists! Please enter another name.");
                return resolve(false);
            }

            return resolve(true);
        }, reject);

    })
};

const runRequest = async () => {
    try {

        const result = await makeRequest();

        // This will not log until your request has succeeded.
        console.log(`Result = ${result}`);
    } catch (e) {
        console.log("Error making request", e);
    }
}



// Run the request
runRequest();

像您这样的声音应该查阅Promises,回调和异步控制流,值得一读!

仅使用Promise API,就可以在不进行异步/等待的情况下编写runRequest。例如

const runRequest = () => {

    makeRequest()
        .then((result) => {
            console.log(`Result = ${result}`);
        })
        .catch((error) => {
            console.log("Error making request", e);
        });
}

或者最后,您可以使用回调编写它。

const makeRequest = (success, error) => {
    $.getJSON(
        "/if_name_exists",
        {
            name: "sample_name"
        },
        success,
        error
    );
};

const runRequest = () => {
    makeRequest(
        data => {
            if (data.check == "True") {
                alert("Name already exists! Please enter another name.");
                return resolve(false);
            }
        },
        error => {
            console.log("Error making request", e);
        }
    );
};

// Run the request
runRequest();

注意:如果$ .getJSON返回一个Promise,则可以省略Promise构造函数调用,不确定是否执行,即仅支持回调,因此我在makeRequest中明确返回了Promise。