如何消除async函数返回数组外层的Promise,直接获取目标数组
问题原因
所有声明为async的函数,无论你return的是什么类型的值,最终返回值都会自动被包装为Promise对象。你直接将getUsers()的返回值赋值给users变量,拿到的自然就是Promise实例,而不是内部的返回数据。
解决方法
有两种常用方式可以拿到Promise内部的数组数据:
方法1:在async作用域内使用await获取结果
await只能在async标记的函数内部使用,你可以用自执行匿名async函数来包裹调用逻辑,示例代码:
async function getUsers(query){ try{ const results = await client.query(query); const data = results.rows; console.log("data",data) return data; } catch(err) { console.log(err.stack); }finally{ client.end(); } } // 用自执行async函数包裹调用逻辑 (async () => { const users = await getUsers(`Select * from users;`); // 这里就能直接拿到数组,打印正常结果 console.log(users); // 后续要使用users的逻辑都要写在这个作用域内部 })()
方法2:使用.then()回调获取结果
Promise实例自带.then()方法,内部回调会在Promise状态变为fulfilled的时候触发,参数就是Promise内部返回的数据:
getUsers(`Select * from users;`).then(users => { // 回调内部可以拿到正常的数组数据 console.log(users); // 后续使用users的逻辑都要写在这个回调内部 })
注意事项
你当前的getUsers函数的finally逻辑里直接调用了client.end(),会在第一次调用getUsers执行结束后就关闭数据库连接,如果后续还要调用这个方法查询数据会报错。如果有多次查询需求,建议把数据库连接关闭的逻辑移到所有查询都执行完成的位置,而不是写在getUsers内部。
内容的提问来源于stack exchange,提问作者KurragömmicPark
相关产品推荐
相关产品推荐

