首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当页面跳转时,请求丢失

当页面跳转时,请求丢失
EN

Stack Overflow用户
提问于 2017-06-03 16:56:19
回答 2查看 44关注 0票数 0
代码语言:javascript
复制
fetch(url, { method: 'POST', body: data, mode: 'cors' }).then(
    () => Promise.resolve(success),
    () => Promise.reject(error),
);

我有一个页面,页面有一个跳转按钮,当我点击这个按钮时,我的页面被location.hrefwindow.open ()跳转到另一个页面。

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

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

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

EN

回答 2

Stack Overflow用户

发布于 2017-06-03 16:59:12

方法1:

尽管您的XHR请求可能需要很长时间才能执行,但您可以为该请求获取readyState以利用它。

readyState数字含义:

  • 0:尚未调用未发送的open()。
  • 1:已调用已打开的send()。
  • 2:已调用HEADERS_RECEIVED send(),且标头和状态可用。
  • 3:正在加载下载;responseText保存部分数据。
  • 4:操作已完成。

通常情况下,可以放手并使用readyState >= 2转到下一页。因为大多数服务器在此时开始处理数据,即使您取消请求,也不会执行任何检测来停止。

代码语言:javascript
复制
var xhr = new XMLHttpRequest();
xhr.open('GET', 'https://en.wikipedia.org/api/rest_v1/page/');
xhr.onreadystatechange = () => {
  console.log(xhr.readyState);
  if (xhr.readyState>=2) window.location.href = 'http://targeturl';
};
xhr.send();

方法二:

这是通过服务器委托调用的另一种工作方式。

代码语言:javascript
复制
var url = 'http://ip:port/uri?delegation=http%3A%2F%2Fwww.google.com';

fetch(url, { method: 'POST', body: data, mode: 'cors' }).then(
    () => {
       window.location.href = 'http://targeturl';
    },
    () => Promise.reject(error),
);

然后您的服务器解析delegation部件并在另一个线程中请求ex:,然后尽快返回,这样主页就不会被阻塞。

票数 2
EN

Stack Overflow用户

发布于 2017-06-06 15:30:26

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

代码语言:javascript
复制
// Helper that creates a Promise that resolves after n milliseconds
const delay = n => new Promise(resolve => setTimeout(resolve, n));

Promise.race([fetch(url), delay(1000)])
  .then(() => redirectElsewhere())
  .catch(() => {/* handle error */});

Promise.race()采用可迭代的承诺,并在第一个承诺解决时立即解决(或在第一个拒绝时拒绝)。

这样做的效果是,您将在请求承诺解决时重定向,或在1000ms之后重定向,以先到者为准。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44342173

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档