我是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') })();
但是我的代码仍然不等待响应,而是执行后续步骤。我该如何解决这个问题?
答案 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。