【问题标题】:Can't get data return from another file React Native无法从另一个文件 React Native 获取数据返回
【发布时间】:2020-08-01 11:32:51
【问题描述】:

我正在使用外部实用程序文件。它只是一个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);
        })
})
}

在我的完整状态组件中,我已经导入了 de 实用程序文件,我正在尝试获取数据:

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...

而且我不知道出了什么问题。 初始状态是好的

【问题讨论】:

    标签: javascript react-native async-await


    【解决方案1】:

    谢谢大家。 我已经重构了我的代码,我意识到这种方式是可行的

    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]);
            });
        });
    })
    }
    

    【讨论】:

    • 但是包含一个代码示例是个好主意,无论它多么简单,它都可能会有所帮助。它被标记
    • 不确定您的意思?我包含了一个带有解释的工作示例 - 见下文。
    【解决方案2】:

    我不熟悉您正在使用的库,但它看起来像调用 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); })

    希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      因为您实际上需要从 getUser() 中返回数据。你可以通过使用 promise resolve reject 来做到这一点

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-11-07
        • 1970-01-01
        • 2019-11-03
        • 1970-01-01
        • 2019-07-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多