我已经仔细阅读了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')
行之前执行。
我做错了什么?
答案 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
}
)
});
});
}