如何轮询GET请求,直到结果成功为止

时间:2019-02-05 00:42:41

标签: javascript jquery ajax

我在javascript中具有使用AJAX发送GET请求的功能。如果作业尚未完成,则请求将返回successfailin process。我希望有一个函数每隔几秒钟发送一次GET请求,直到结果为successfail并返回该结果。到目前为止,这是我所拥有的,但是由于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);
        }
    });

2 个答案:

答案 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 => //您想对响应做些什么)