gpt4 book ai didi

jquery - 在 while 循环中延迟

转载 作者:行者123 更新时间:2023-12-01 03:08:57 24 4
gpt4 key购买 nike

所以我想在 jquery 中执行延迟的 ajax 请求,直到收到特定的服务器响应(非空)。我该如何去做呢?

while (data.response != null) {
$.ajax(..).done(function(data);
}

function doUntilResult() {
Server.doA().done(function(data) {
Server.doB(data).done(function(result) {
//if result == null, repeat again
});
});
}

最佳答案

你不能在 Javascript 中像这样循环。 Javascript 是一个事件驱动的系统。当您像这样循环时,无法处理其他事件。因此,即使您的第一个 Ajax 调用也不会得到处理。事实上,当客户端试图同时进行数百万个 ajax 调用时,您可能会耗尽一些资源,从而使 JS 引擎陷入困境。

相反,您可以异步使用ajax结果,然后根据结果决定是否再次调用它:

function poll() {
$.ajax(...).then(function(data) {
if (!data.xxxx) {
// call it again after some short delay
setTimeout(poll, 1000);
} else {
// got the result we wanted, process it
}
})
}

// start the polling
poll();

如果你想让整个事情返回一个 promise ,你可以这样做:

function delay(t) {
return new $.Deferred(function(def) {
setTimeout(def.resolve, t);
}).promise();
}

function poll() {
return $.ajax(...).then(function(data) {
if (!data.xxxx) {
// call it again after some short delay
return delay(1000).then(poll);
} else {
// got the result we wanted, process it
return someValue;
}
})
}

// start the polling
poll().then(function(result) {
// process result here
});

附注尽可能快地不断轮询某些服务器几乎从来都不是正确的事情。如果您只有几个用户,这可能会很好地工作,但是一旦您有很多用户,所做的就是用空的轮询请求淹没您的服务器,而大多数时候,没有任何内容可以返回给客户端。这对于处理负载来说是一场噩梦。最好找到一个不轮询的架构,但如果您要轮询,那么至少使用某种计时器在将来的某个时间进行轮询,而不是尽可能快地轮询。

P.P.S。如果您确实只是在等待服务器上的某些值发生更改,那么也许您应该使用 webSocket 连接。这样,客户端就建立了与服务器的连接,并且该连接持续存在,然后在将来的任何时候,服务器都可以简单地向客户端发送消息。客户端根本不需要进行轮询。这可以大大提高您的服务器基础设施的效率,并可以提供更及时的结果。

关于jquery - 在 while 循环中延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38546932/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com