我有一个与承诺有关的问题,异步等待。
Q –假设我们有一个for循环,其中有一个XHR请求,现在我们如何确保记录最后的XHR请求响应。
例如。
let myresponse = “”;
for(let i = 0; i < 5; i++){
fetch("http://www.mocky.io/v2/5b56dab131000062164d1f15?mocky-delay=" + Math.floor(Math.random() * 5000) + "ms").then(resp => resp.json()).then(resp => {
console.log(resp);
});
}
现在在上述情况下,我想确保“ myresponse”变量具有上一个XHR请求的响应,即“ i”为4时。每个请求的响应延迟都可能不同。 比方说 第一个请求的响应延迟为3秒-“ XXX” 第二个请求的延迟为2秒,响应为“ XXX” 第三个请求的响应延迟为5秒-“ XXX” 第四个请求的响应延迟了2秒-“ XXX” 第5个请求的响应延迟为1秒-“ XXX”
因此,“ myresponse”应在第5个请求中包含“ XXX”,而不是第3个请求。
我已经使用闭包和一个增量变量来完成它,但是在那种情况下,我们必须维护一个保留非常请求响应的集合。
现实世界的例子可能是,如果用户单击按钮10次,我们希望用户看到第十次请求的结果,而不是花费时间最长的请求的结果。
答案 0 :(得分:0)
以您的示例为例,您可以简单地调整最后一个then()
回调。
例如:
.then(resp => { if (i === 4) { myresponse = resp; } }
对于更通用的/按钮情况,您可以有一个计数器来跟踪发出了多少个请求,然后让请求回调检查在完成时是否为最新请求:
let latestId = 0;
let latestResult;
function doFetch() {
let myId = ++latestId;
fetch("https://example.com").then(resp => {
if (myId === latestId) {
latestResult = resp.json();
}
}
}