fetch(url, { method: 'POST', body: data, mode: 'cors' }).then(
() => Promise.resolve(success),
() => Promise.reject(error),
);我有一个页面,页面有一个跳转按钮,当我点击这个按钮时,我的页面被location.href或window.open ()跳转到另一个页面。
但是我想通过上面的fetch函数在点击跳转按钮时发送一个请求。
现在,问题是页面跳转得太快,请求失败。当我设置一个长延迟时,跳转是成功的,有更好的方法来处理它。
请原谅,我的英语不太好,希望你能理解。
发布于 2017-06-03 16:59:12
方法1:
尽管您的XHR请求可能需要很长时间才能执行,但您可以为该请求获取readyState以利用它。
readyState数字含义:
通常情况下,可以放手并使用readyState >= 2转到下一页。因为大多数服务器在此时开始处理数据,即使您取消请求,也不会执行任何检测来停止。
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();
方法二:
这是通过服务器委托调用的另一种工作方式。
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:,然后尽快返回,这样主页就不会被阻塞。
发布于 2017-06-06 15:30:26
如果您更关心重定向而不是请求是否成功,您可以使用Promise.race()来引发超时:
// 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之后重定向,以先到者为准。
https://stackoverflow.com/questions/44342173
复制相似问题