Javascript 并发长轮询函数

Javascript 并发长轮询函数,javascript,Javascript,我正在尝试编写一个简单的函数,它长时间轮询服务器,并将响应打印到控制台 我不是javascript开发人员,回调让我感到困惑 此代码适用于: const addr = "http://localhost:8080/action" function longPoll(urls) { try { var xhttp = new XMLHttpRequest(); xhttp.open("GET", urls, false); xhttp.setRequestHeader

我正在尝试编写一个简单的函数,它长时间轮询服务器,并将响应打印到控制台

我不是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")

您应该在超时时调用回调,这样它就不会阻塞主线程。下面的代码大约每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")

您应该在超时时调用回调,这样它就不会阻塞主线程。下面的代码大约每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")

您正在使用一个同步请求,调用open-时为false。如果您在使用回调时遇到问题,也许可以展示一下您在这方面的尝试,因为这是更好的方法。只是一个观察:我是业余的go程序员,几乎没有javascript经验。Go并发语法与js相比非常简单。您使用的是一个同步请求,在对open-的调用中为false。如果您在使用回调时遇到问题,也许可以展示一下您在这方面的尝试,因为这是更好的方法。只是一个观察:我是业余的go程序员,几乎没有javascript经验。与js相比,Go并发语法非常简单。为什么选择downvote?OP递归调用longPoll,并且从不返回。SetTimeout允许代码继续执行,同时仍以指定的速率轮询新数据。这实际上似乎解决了问题。打印结束并继续轮询。谢谢setTimeout不使用新线程。它计划稍后在同一线程上完成工作。这仍然使用同步请求,这将在请求完成时阻止所有其他JS的运行。考虑到它打算用作一个长轮询请求,这使得这种方法更加糟糕——在请求完成时,整个UI可能会被阻塞很长一段时间。的确,它确实会阻塞UI。我正在研究如何使它成为一个新的选择,为什么会投反对票?OP递归调用longPoll,并且从不返回。SetTimeout允许代码继续执行,同时仍以指定的速率轮询新数据。这实际上似乎解决了问题。打印结束并继续轮询。谢谢setTimeout不使用新线程。它计划稍后在同一线程上完成工作。这仍然使用同步请求,这将在请求完成时阻止所有其他JS的运行。考虑到它打算用作一个长轮询请求,这使得这种方法更加糟糕——在请求完成时,整个UI可能会被阻塞很长一段时间。的确,它确实会阻塞UI。我正在研究如何使它异步