fetch怎么设置timeout时间?

js fetch by Xudong Zhang @ 2016-10-15 14:15:12

jquery的ajax可以设置timeout时间,现在用fetch,发现没有timeout设置,如果服务器没有响应或者地址错误,得等几十秒才返回timeout错误,这个似乎是浏览器的timeout吧。

如果我希望1秒或者2秒没有响应就timeout该怎么处理呢?


在fetch里issue里发现的两个不错的方法原文链接

newFetch = function(input, opts) {
    return new Promise((resolve, reject) => {
        setTimeout(reject, opts.timeout);
        fetch(input, opts).then(resolve, reject);
    });
}

newFetch('http://www.example.com/api/test', {timeout: 2000})
    .then(res => res.json())
    .then(json => console.log(json))
    .catch(err => console.log(err))

或者利用Promise.race([]),我用这个来判断视频缓存服务器是否可用

var p = Promise.race([
  fetch('http://www.example.com/api/test'),
  new Promise(function (resolve, reject) {
    setTimeout(() => reject(new Error('request timeout')), 5000)
  })
])
p.then(response => console.log(response))
p.catch(error => console.log(error))

这个也可以简单封装成newFetch function.

by Xudong Zhang @2016-10-15 15:24:20.865 +0800 CST


我来回答

Markdown格式技巧

  • 行尾添加2个空格或者添加一个空行就能换行
  • 斜体: *hello* 或者 _world_
  • 加粗: **hello** 或者 __world__
  • 代码块: 添加空行,然后代码缩进4个空格
  • 特殊字符: 用\避免转义;\*就是*本身
  • python: `__name__`可以以代码形式输出__name__
  • 一个简单的例子

切换到移动版