我有一个用户登录功能正在工作。但是,我想合并一个超时错误的获取。有没有办法设置一个计时器为5秒左右,将停止尝试获取后,这样的时间?否则,我只是得到一个红色屏幕后,一段时间说网络错误。
_userLogin() {
var value = this.refs.form.getValue();
if (value) {
// if validation fails, value will be null
if (!this.validateEmail(value.email)) {
// eslint-disable-next-line no-undef
Alert.alert('Enter a valid email');
} else {
fetch('http://51.64.34.134:5000/api/login', {
method: 'POST',
headers: {
Accept: 'application/json',
'Content-Type': 'application/json',
},
timeout: 5000,
body: JSON.stringify({
username: value.email,
password: value.password,
}),
})
.then((response) => response.json())
.then((responseData) => {
if (responseData.status == 'success') {
this._onValueChange(STORAGE_KEY, responseData.data.token);
Alert.alert('Login Success!');
this.props.navigator.push({name: 'StartScreen'});
} else if (responseData.status == 'error') {
Alert.alert('Login Error', responseData.message);
}
})
.done();
}
}
}
7条答案
按热度按时间brtdzjyr1#
我做了一个ES6函数,将ES获取封装到一个promise中,如下所示:
下面是如何使用它:
uttx8gqw2#
我认为使用
AbortController
是中止fetch
调用的推荐方法。上面的代码片段处理以下情况:1.如果网络正常,但HTTP返回错误状态,则将记录消息“HTTP错误!...”。
1.如果网络中断,
setTimeout
将触发AbortController
在三秒后中止fetch
。将记录消息“网络错误”。1.如果网络良好且HTTP响应良好,则将记录响应JSON。
使用
AbortController
中止fetch
的文档为here。e5nszbig3#
a timeout option isn't defined in the official spec yet . There is an abort defined没有标准的处理方法,你可以把它和你自己的超时和承诺一起使用。例如这里和这里看到的。我复制了示例代码,但还没有自己测试过。
另一种选择是自己修改fetch.js模块,添加调用abort的超时,如下图所示。
rjee0c154#
这是我绕过去的方法:(这是我用来在应用程序上进行所有调用的“通用”函数)
我创建了一个超时函数,除非之前清除,否则将触发该函数,然后我在服务器响应时清除此超时
kx5bkwkv5#
我通过使用两个承诺之间的竞争解决了这个问题,写为一个关于获取的 Package 器。在我的例子中,我希望请求返回json,所以也添加了这一点。也许有一个更好的解决方案,但这对我来说是正确的!
Package 器返回一个承诺,只要没有代码错误,它就会解决问题。你可以检查result.status是否为“success”,并从www.example.com读取json数据result.data。如果有错误,你可以在result.data中读取确切的错误,并将其显示或记录在某个地方。这样你总是知道哪里出错了!
pinkon5k6#
gcxthw6b7#
我可能会迟到,但我做了一个代码,这是100%的工作超时的API请求使用提取。
您只需要将
api-endpoint
传递给url,将body
传递给options
参数。