Как сделать процесс после завершения процесса извлечения? - PullRequest
0 голосов
/ 25 февраля 2019

поэтому у меня есть метод выборки, внутри этой выборки у меня есть функция Object, которая будет зацикливать данные, возвращенные из выборки, и вставлять их в локальную таблицу / базу данных.

, но когда процесс завершится, яхочу сделать 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 голосов
/ 25 февраля 2019

Вы в основном забыли проверить, успешен ли запрос на выборку.Добавьте catch () и , если , чтобы проверить соответствующий код состояния.

Обещание fetch () будет отклонено с ошибкой TypeError, когда сетьобнаружена ошибка или неверно настроен CORS на стороне сервера, хотя это обычно означает проблемы с разрешениями или подобное - например, 404 не является сетевой ошибкой.Точная проверка успешного выполнения fetch () будет включать проверку выполнения обещания, а затем проверку того, что свойство Response.ok имеет значение true. Источник

Ваш код должен выглядеть примерно так:

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);
});
0 голосов
/ 25 февраля 2019

Может быть, попробуйте это простое исправление, чтобы увидеть, является ли этот элемент последним, добавляемым в базу данных, если это правда, то setState?как if(Object.keys(JSON.parse(res.GetDataResult.RetVal)).length - 1 === index) { // dosomething as this the last action in the loop}

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, index ) => {
                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');
                        if(Object.keys(JSON.parse(res.GetDataResult.RetVal)).length - 1 === index) {
                        this.setState({ // I want to call this after Object finished
                          count : this.state.count + 1
                        })
    }
                    })
                })
            })
        })

Дайте мне знать, если это работает.:)

...