【发布时间】:2017-12-08 02:54:14
【问题描述】:
我有这个用于管理仪表板的代码,其中包含大约 100 个独立检查。
通过 AJAX 调用接收检查结果。
在开始时,每项检查都有一个初始请求。在收到特定检查的结果后,代码递归等待设置超时并再次重复该检查的请求。
一个承诺 = 一个检查。
我想知道为什么 Promise 仅在 每个都处于待处理状态(它们都没有处于超时期限)之后才开始解决。即使来自服务器的响应是“即时的”,它们也只是等待循环中的最后一个承诺。
const TIMEOUT = 4000;
function checkForUpdate(environment, application, check) {
Dashboard.setCheckPending(environment, application, check);
return Communicator.getStatus(environment, application, check)
.then(status => {
Dashboard.updateCheckCell(environment, application, check, status);
Dashboard.updateEnvironmentCell(environment, application);
setTimeout(() => {
return checkForUpdate(environment, application, check)
},
TIMEOUT
);
});
}
Communicator.getEnvMatrix()
.then(data => {
Dashboard.create(data);
$.each(data, (environment, applications) => {
$.each(applications, (application, checks) => {
$.each(checks, (key, check) => {
checkForUpdate(environment, application, check);
});
});
});
});
问题还在于如何重写它,以便每个检查只等待自己的结果被传递并设置超时。
编辑(澄清):
100 个检查中的每一个都是独立的,这就是为什么我想尽快为每个检查运行 AJAX(在 $.each() 循环内)。
检查仅依赖于自身。我不希望它等待任何其他检查。
收到检查结果后,它必须等待设置的超时时间才能再次尝试检索其状态。这就是我将递归函数封装在setTimeout() 中的原因。
即使我重写(见下文)setTimeout() 作为承诺,不幸的是行为保持不变。
function delay(timeout) {
return new Promise(resolve => {
setTimeout(resolve, timeout);
});
}
function checkForUpdate(environment, application, check) {
Dashboard.setCheckPending(environment, application, check);
let promise = Communicator.getStatus(environment, application, check).promise();
return promise
.then(status => {
Dashboard.updateCheckCell(environment, application, check, status);
Dashboard.updateEnvironmentCell(environment, application);
return delay(TIMEOUT).then(() => {
return checkForUpdate(environment, application, check);
});
});
}
【问题讨论】:
-
为什么不用resolve()代替Timeout
-
你能更好地描述这段代码应该完成什么吗?这里有几处错误,但我不太理解这段代码的目标是知道如何提出适当的替代方案。例如,您在超时后调用
checkForUpdate(),但这完全独立于所有先前的承诺,因此它与任何这些都无关,而且您似乎永远都在这样做。这真的是你想要的吗? -
递归的
checkForUpdate()应该被链接到原来的promise 上还是只是开始一个新的独立promise 链? -
浏览器对同一主机同时运行的 ajax 调用数量是有限制的,因此后续调用将排队等待较早的调用完成。浏览器会在同一主机上同时运行多少个 ajax 调用而有所不同,但这是一个相对较小的数字(比如 10 个以下)。因此,如果您的
.each()循环开始对同一主机进行一百次 ajax 调用,您将达到限制。 -
而且,如果这是您真正的问题,为什么不将其放入问题中,以便我们直接解决?如果您更清楚自己观察到的内容和期望的内容,我们可以为您提供更好的帮助。一个小时后,我们在这里来回奔波,直到现在你才描述你实际观察到的和你期望的。当您隐瞒这些信息时,真的很难提供帮助。
标签: javascript promise