Javascript 并发长轮询函数
我正在尝试编写一个简单的函数,它长时间轮询服务器,并将响应打印到控制台 我不是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
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。我正在研究如何使它异步