所以我有一个fetch方法,在该fetch中,我有Object函数,该函数将循环从fetch返回的数据并将它们插入本地表/数据库中。
但是当过程完成时,我想做一个setState。 我得到的是,在提取完成之前,已经调用了setState。
fetch ( link, {
method : 'POST' ,
headers : {
'Accept' : 'application/json' ,
'Content-Type' : 'application/json' ,
'x-api-key' : api
} ,
body : JSON.stringify({
"ent":
{
"GetDataCode":"GRELIGION",
"AppId": APPID
}
})
})
.then ( response => response.json() )
.then ( res => {
db.transaction( ( tx ) => {
tx.executeSql('DELETE FROM Religion')
})
Object.keys(JSON.parse(res.GetDataResult.RetVal)).map( ( key ) => {
db.transaction( ( tx ) => {
tx.executeSql('INSERT INTO Religion VALUES (?,?)' , [ (JSON.parse(res.GetDataResult.RetVal))[key].ID , (JSON.parse(res.GetDataResult.RetVal))[key].Description ] , () => {
console.log('done')
} )
})
})
this.setState({ // I want to call this after Object finished
count : this.state.count + 1
})
})
如果我写错了,请纠正我
预先感谢
答案 0 :(得分:1)
可以尝试使用此简单的修补程序,以查看多数民众赞成在多数民众赞成在数据库中的最后一项,一旦多数民众赞成成立,那么setState吗?
像annotations
if(Object.keys(JSON.parse(res.GetDataResult.RetVal)).length - 1 === index) { // dosomething as this the last action in the loop}
让我知道是否可行。 :)
答案 1 :(得分:0)
您基本上忘了检查获取请求是否成功。添加 catch()和 if 以检查适当的状态码。
当遇到网络错误或在服务器端未正确配置CORS时,fetch()承诺将拒绝TypeError,尽管这通常意味着权限问题或类似问题,例如404并不构成网络错误。准确检查成功的fetch()包括检查已解决的诺言,然后检查Response.ok属性的值为true。 Source
您的代码应如下所示:
fetch('link', ...).then(function(response) {
if(response.ok) {
return response.json();
}
throw new Error('Network response was not ok.');
}).then(function(res) {
...;
this.setState(...);
}).catch(function(error) {
console.log('There has been a problem with your fetch operation: ', error.message);
});