我正在使用异步/等待,但仍返回未定义

时间:2019-04-05 23:15:46

标签: javascript react-native asynchronous async-await

我已经仔细阅读了google和有关堆栈溢出的前两个问题,但是作为菜鸟,我仍然没有得到我期望的结果

How do I return the response from an asynchronous call?

How do I convert an existing callback API to promises?

尤其是上面的一个回答

“ ES2017 +:带有异步/等待的承诺

2017年发布的ECMAScript版本引入了对异步函数的语法级支持。借助async和await,您可以以“同步样式”编写异步。该代码仍然是异步的,但更易于阅读/理解。”

...这就是我使用async / await所走的方向

我在运行此代码的react native页面上有一个按钮

onPressRefreshButton = async () => {
        const rows = await ReturnAllRowsFromTable('NameOfTable')
        console.log(rows)
    }

此函数位于上述外部的导入文件中,它返回表中所有行的列表

export async function ReturnAllRowsFromTable(tableName){
    db.transaction(tx => {
        tx.executeSql(
            'SELECT * FROM ' + tableName + ';',
            [],
            (tx, results) => {
                if (results && results.rows && results.rows._array) {
                    console.log('all rows returned')
                    console.log(results.rows.item(0))
                    return await results.rows._array
                }
            },
            (tx, error) => {
                console.log(error);
            }
        )
    });
}

当我按下按钮时,控制台中会显示以下内容

undefined
all rows returned
Object {
  "key": "value",
  "key2": "value",
}

即使我通过每个函数都进行了异步/等待调用,看来console.log(rows)行还是在const rows = await ReturnAllRowsFromTable('NameOfTable')行之前执行。

我做错了什么?

1 个答案:

答案 0 :(得分:0)

您没有返回交易的结果,而是基于提供的API,您将创建一个新的Promise来包装交易操作并将其返回,以便您可以await的结果:

export async function ReturnAllRowsFromTable(tableName){
    return new Promise(function(resolve, reject) {
        db.transaction(tx => {
            tx.executeSql(
                'SELECT * FROM ' + tableName + ';',
                [],
                (tx, results) => {
                    if (results && results.rows && results.rows._array) {
                        console.log('all rows returned')
                        console.log(results.rows.item(0))
                        resolve(results.rows._array); // return result to caller
                    }
                },
                (tx, error) => {
                    console.log(error);
                    reject(error); // return error to caller
                }
            )
        });
    });
}