Javascript 页面跳转时请求丢失

Javascript 页面跳转时请求丢失,javascript,promise,request,fetch,Javascript,Promise,Request,Fetch,我有一个页面,该页面有一个跳转按钮,当我单击该按钮时,我的页面被location.href或window.open()跳转到另一个页面 但是我想在点击跳转按钮时,通过上面的fetch函数发送一个请求 现在,问题是页面跳转太快,请求失败。当我设置一个长延时时,跳远就是成功的,有更好的方法来处理它 原谅我,我的英语不好,希望你能理解。方法一: 尽管执行XHR请求可能需要很长时间,但您可以获取该请求的readyState,以利用它 数字含义: 0:尚未调用UNSENT open() 1:已调用OPE

我有一个页面,该页面有一个跳转按钮,当我单击该按钮时,我的页面被
location.href
window.open()
跳转到另一个页面

但是我想在点击跳转按钮时,通过上面的
fetch
函数发送一个请求

现在,问题是页面跳转太快,请求失败。当我设置一个长延时时,跳远就是成功的,有更好的方法来处理它

原谅我,我的英语不好,希望你能理解。

方法一: 尽管执行XHR请求可能需要很长时间,但您可以获取该请求的
readyState
,以利用它

数字含义:

  • 0:尚未调用UNSENT open()
  • 1:已调用OPENED send()
  • 2:已调用HEADERS_RECEIVED send(),并且HEADERS和status可用
  • 3:加载下载;responseText保存部分数据
  • 4:操作完成
通常情况下,当
readyState>=2
时,可以放手并转到下一页。因为大多数服务器此时开始处理数据,即使您取消请求,也不会执行任何停止检测

var xhr=new-XMLHttpRequest();
xhr.open('GET','https://en.wikipedia.org/api/rest_v1/page/');
xhr.onreadystatechange=()=>{
console.log(xhr.readyState);
如果(xhr.readyState>=2)window.location.href=http://targeturl';
};
xhr.send()方法1:
尽管执行XHR请求可能需要很长时间,但您可以获取该请求的
readyState
,以利用它

数字含义:

  • 0:尚未调用UNSENT open()
  • 1:已调用OPENED send()
  • 2:已调用HEADERS_RECEIVED send(),并且HEADERS和status可用
  • 3:加载下载;responseText保存部分数据
  • 4:操作完成
通常情况下,当
readyState>=2
时,可以放手并转到下一页。因为大多数服务器此时开始处理数据,即使您取消请求,也不会执行任何停止检测

var xhr=new-XMLHttpRequest();
xhr.open('GET','https://en.wikipedia.org/api/rest_v1/page/');
xhr.onreadystatechange=()=>{
console.log(xhr.readyState);
如果(xhr.readyState>=2)window.location.href=http://targeturl';
};

xhr.send()如果您更关心重定向而不是请求是否成功,则可以使用
Promise.race()
来引发超时:

fetch(url, { method: 'POST', body: data, mode: 'cors' }).then(
    () => Promise.resolve(success),
    () => Promise.reject(error),
);
Promise.race()
接受一系列承诺,并在第一个承诺解决时立即解决(或在第一个拒绝时拒绝)


这将给您带来的效果是,您将在请求承诺解决时重定向,或在1000毫秒后重定向,以先到者为准。

如果您更关心重定向而不是请求成功,您可以使用
Promise.race()
来诱导超时:

fetch(url, { method: 'POST', body: data, mode: 'cors' }).then(
    () => Promise.resolve(success),
    () => Promise.reject(error),
);
Promise.race()
接受一系列承诺,并在第一个承诺解决时立即解决(或在第一个拒绝时拒绝)


这将给您带来的效果是,当请求承诺解决时,或1000毫秒后(以先到者为准),您将重定向。

我知道这种方法,但请求时间可能很长或请求失败,但是我想确保重定向到另一个页面的成功率为100%,并且尽可能快。您可以控制请求服务器吗?我无法控制服务器添加的方法3-为了替换旧方法1(对您不起作用),我知道这种方法,但请求时间可能很长或请求失败,但是我想确保重定向到另一个页面的成功率为100%,并且尽可能快。您可以控制请求服务器吗?我无法控制服务器添加的方法3-以替换旧方法1(对您不适用)