Я использую async / await, но он по-прежнему возвращает неопределенный - PullRequest
0 голосов
/ 06 апреля 2019

Я полностью прочитал Google и эти 2 предыдущих вопроса о переполнении стека, но как новичок я все еще не получаю ожидаемый результат

Как мне вернуть ответ от асинхронного вызова?

Как преобразовать существующий API обратного вызова в обещания?

В частности, один из приведенных выше ответов говорит

"ES2017 +: обещания с асинхронностью/ await

В версии ECMAScript, выпущенной в 2017 году, появилась поддержка асинхронных функций на уровне синтаксиса. С помощью async и await вы можете писать асинхронно в «синхронном стиле». Код по-прежнему асинхронный, но этолегче читать / понимать. "

... так что это направление, в котором я пошел, используя async / await

У меня есть кнопка на собственной странице реакции, которая запускает этот код

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

Когда я нажимаю кнопку, я получаю следующееng в консоли

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

Таким образом, кажется, что строка console.log(rows) выполняется перед строкой const rows = await ReturnAllRowsFromTable('NameOfTable'), хотя у меня есть асинхронные / ожидающие вызовы во всех функциях.

Что я сделал не так?

1 Ответ

0 голосов
/ 06 апреля 2019

Вы не вернули результат транзакции, основываясь на предоставленном 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
                }
            )
        });
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...