我在javascript中具有使用AJAX发送GET请求的功能。如果作业尚未完成,则请求将返回success
或fail
或in process
。我希望有一个函数每隔几秒钟发送一次GET请求,直到结果为success
或fail
并返回该结果。到目前为止,这是我所拥有的,但是由于setTimeout再次调用了该函数,因此无法获得返回值。有没有办法将此函数作为promise并在完成后返回结果?
function get_r(name) {
$.ajax({
url: "/get/" + name
}).done(function( result ) {
if (JSON.parse(result) === 'success') {
return "Finished"
}
else if (JSON.parse(result) === 'fail') {
return "Failed"
}
else {
setTimeout(function() { get_r(name); }, 1000);
}
});
答案 0 :(得分:0)
您可以在await
循环中while
响应,直到响应“完成”或“失败”为止。请注意,由于响应不是JSON格式,因此JSON.parse
是不必要的:
const delay = ms => new Promise(resolve => setTimeout(resolve, ms));
async function get_r(name) {
while (true) {
const result = await $.ajax({ url: "/get/" + name });
if (result === 'success') return 'Finished';
else if (result === 'fail') return 'Failed';
await delay(1000);
}
}
虽然此功能与您的原始代码相似,但最好限制重试次数(服务器响应是什么,例如“此时无法处理请求”,而不是通过重试)。到返回“失败”的后端代码?)。这可以通过使用for
循环而不是while
循环来实现:
const delay = ms => new Promise(resolve => setTimeout(resolve, ms));
async function get_r(name) {
// maximum of 5 requests
for (let i = 0; i < 5; i++) {
const result = await $.ajax({ url: "/get/" + name });
if (result === 'success') return 'Finished';
else if (result === 'fail') return 'Failed';
await delay(1000);
}
return 'Server unresponsive';
}
答案 1 :(得分:0)
如何使用promises中的.then方法。
您可以像这样使用axios:
axios.get(url).then(res => //您想对响应做些什么)