在 React Native 中,使用 fetch
API 进行网络请求时,异常处理是非常重要的. React native 的 fetch 却不提供超时异常。
在 React Native 中,fetch
API 本身并不直接支持超时(timeout)功能。通常通过包装 fetch
调用并在一个 setTimeout
函数中取消请求来实现超时功能。较为复杂。
React Native 中已经内置了XMLHttpRequest API(也就是俗称的 ajax)。这种老式的ajax请求在react native中是可以跨域的。这里设置timeout即可。
但 XMLHttpRequest 没有 async/ await 语法,使用 Promise 简单封装一下即可。
export const DefaultOptions = { type: 'application/json', timeout: 180000, } export const get = (url: string, options: Partial<typeof DefaultOptions> = {}) => new Promise((resolve, reject) => { const request = new XMLHttpRequest(); request.onreadystatechange = e => { if (request.readyState !== 4) { console.log(url, request.readyState) return; } if (request.status === 200) { const { responseText } = request try { const json = JSON.parse(responseText) resolve(json) } catch(e) { resolve(responseText) } } else { reject(new Error('Status code:' + request.status)) } }; request.open('GET', url); request.setRequestHeader('Content-Type', options.type || DefaultOptions.type); request.timeout = options.timeout || DefaultOptions.timeout; request.withCredentials = true; request.send(); })
使用:
await json = get('http://' + reqUrl + '/version', { timeout: 10000 })
回复 (0)
微信扫码 立即评论