Не удается получить данные из другого файла React Native - PullRequest
2 голосов
/ 19 апреля 2020

Я использую внешний файл утилит. Это просто файл JS.

export const getUser = async () =>  {

db = SQLite.openDatabase("PegaPreco_data_src");
await db.transaction(tx => {
    tx.executeSql(
        "create table if not exists user (id text primary key not null, cpf text, nome text, " +
        "email text, senha text);"
    );
});

return await db.transaction(tx => {
    tx.executeSql("select * from user", [],
        (_, { rows }) => {
            console.log('My rowa', rows._array[0]); //console print - Ok
            return rows._array[0];
        },
        (error) => {
            console.error('Data errors \n', error);
        })
})
}

В моем компоненте полного состояния я импортировал файл утилиты и пытаюсь получить данные:

componentDidMount() {
  getUser()
        .then((MyUser) => {
            console.log(MyUser); //undefined here
            this.setState({ user: MyUser });
        })
        .then(console.log('My console.log for tests', this.state.user)); always the user is undefined
...more code...

И я не могу понять, что не так. Исходное состояние ОК

Ответы [ 3 ]

2 голосов
/ 19 апреля 2020

Я не знаком с библиотекой, которую вы используете, но похоже, что вызов db.transaction и затем tx.executeSql ничего не возвращает, то есть это не Promise, который разрешает / отклоняет с некоторым значением. Похоже, что он основан на обратном вызове, поэтому вам придется сделать это «вручную» и превратить его в Promise.

Вот возможное исправление:

// mock for the `db` library you're using
const mockDb = {
  transaction: callback => {
    callback({
      executeSql: (arg1, arg2, cb) => {
        const user = { id: 1, name: "John Doe", age: 20 };
        cb(null, user);
      }
    });
  }
};

// utils/getUser.js
const getUser = () => {
  return new Promise((resolve, reject) => {
    const db = mockDb;

    db.transaction(tx => {
      tx.executeSql("...", "...", () => {});
    });

    db.transaction(tx => {
      tx.executeSql("...", [], (_, result) => {
        resolve(result);
      });
    });
  });
}

// components/MyComponent.js
getUser()
  .then(result => { console.log('result', result); })
  .catch(error => { console.error(error); })

Надеюсь, это поможет.

1 голос
/ 19 апреля 2020

Спасибо всем. Я рефакторинг своего кода, и я понял, что этот способ работает

export const getUser = async () => {
db = SQLite.openDatabase("PegaPreco_data_src");
return new Promise((resolve, rejected) => {

    db.transaction(tx => {
        tx.executeSql("select * from user", [], (_, { rows }) => {
            resolve(rows._array[0]);
        });
    });
})
}
1 голос
/ 19 апреля 2020

Поскольку вам действительно нужно возвращать данные из getUser (). Вы можете сделать это, используя обещание разрешить отклонить

...