并发长轮询功能

时间:2019-01-30 12:42:34

标签: javascript

我正在尝试编写一个简单的函数,该函数可以对服务器进行长时间轮询,并仅打印出对控制台的响应。

我不是javascript开发人员,回调函数使我感到困惑。

此代码有效:

const addr = "http://localhost:8080/action"

function longPoll(urls) {
  try {
    var xhttp = new XMLHttpRequest();
    xhttp.open("GET", urls, false);
    xhttp.setRequestHeader("Content-type", "text/html");
    xhttp.send();
    var response = JSON.parse(xhttp.response);
    console.log(xhttp.response);
    longPoll(urls)
  } catch (error) {
    console.log(error.message);
    longPoll(urls)
  }
};

longPoll(addr);

console.log("end")

但是,永远不会打印“结束”。

在打开页面时同时运行longPoll()的最简单方法是什么?

编辑:

在注释的帮助下,我更改了似乎可以正常工作的代码:

const addr = "http://localhost:8080/action"

function poll() {
  (async () => {
    const response = await fetch(addr)
    const data = await response.json()
    console.log(data)

    setTimeout(poll, 2000)

  })()

}

poll();

console.log("end")

1 个答案:

答案 0 :(得分:-1)

您应该在超时中调用回调,这样它才不会阻塞主线程。以下代码大约每200毫秒调用一次longPoll

const addr = "http://localhost:8080/action"

function longPoll(urls, delay = 5000) {
    try {
        var xhttp = new XMLHttpRequest();
        xhttp.open("GET", urls, false);
        xhttp.setRequestHeader("Content-type", "text/html");
        xhttp.send();
        var response = JSON.parse(xhttp.response);
        console.log(xhttp.response);
    } catch (error) {
        console.log(error.message);
    }

    setTimeout(longPoll, delay, urls, delay)
};

longPoll(addr, 200); // a call delay in milliseconds

console.log("end")