在循环中多个相同的XHR并获取上一个请求的响应。

时间:2018-07-25 07:49:27

标签: javascript ajax loops xmlhttprequest

我有一个与承诺有关的问题,异步等待。

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次,我们希望用户看到第十次请求的结果,而不是花费时间最长的请求的结果。

1 个答案:

答案 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();
        }
    }
}