为什么Javascript async await在这种情况下不起作用?
我对Javascript比较陌生,还没有找到一种方法让我的代码在执行下一步之前等待结果。我对回调做了一些研究,但我的代码似乎无法使其正常工作 我正在使用Flask框架开发一个网页。以下代码调用其中一个端点以获取JSON响应(为什么Javascript async await在这种情况下不起作用?,javascript,flask,Javascript,Flask,我对Javascript比较陌生,还没有找到一种方法让我的代码在执行下一步之前等待结果。我对回调做了一些研究,但我的代码似乎无法使其正常工作 我正在使用Flask框架开发一个网页。以下代码调用其中一个端点以获取JSON响应(name是我发送给端点的参数,data是我返回的JSON响应): 问题是Javascript没有等待这个响应,而是在我的程序中执行接下来的步骤。这就是我尝试过的- $.getJSON('/if_name_exists', { name: "sample_name",
name
是我发送给端点的参数,data
是我返回的JSON响应):
问题是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') })();
但是我的代码仍然没有等待响应并执行接下来的步骤。如何解决此问题?简短回答 带着承诺,或者回电 看起来您正在尝试创建一个异步函数,它等待来自ajax请求的响应/错误 下面是一个工作示例,定义了两个函数,一个是发出请求“makeRequest”的函数,这将返回一个承诺,在网络请求成功或失败时解决 第二个函数是调用发出请求的函数的函数,这里您将看到我放置了一个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();
听起来您应该查找承诺、回调和异步控制流,总的来说,值得一读
只需使用Promise API,就可以在不使用async/await的情况下编写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返回一个承诺,那么您可以忽略承诺构造函数调用,不确定它是否返回了,即只支持回调,因此我在makeRequest中显式返回了一个承诺。您好,感谢您的回答。我尝试了你的第一个解决方案,但似乎不起作用。例如,这个
$.getJSON
代码片段位于另一个函数中,理想情况下,该函数应该根据响应退出。但是,接下来的几行仍然会执行—例如,在此之后仍然会显示一条警报(“消息”)
。听起来您希望解析(false)为拒绝(false)。如果在您的示例data.check==“True”也尝试了该操作,但未起作用,则会触发捕获:/然后我怀疑您的代码中有其他错误。我的答案中的代码片段都是带有async/await和without以及简单回调的承诺的基本示例
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();