完成提取过程后如何进行处理?

时间:2019-02-25 08:25:56

标签: sqlite react-native fetch

所以我有一个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
            })
        })

如果我写错了,请纠正我

预先感谢

2 个答案:

答案 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);
});