Await 返回 [Function] 而不是值

Posted

技术标签:

【中文标题】Await 返回 [Function] 而不是值【英文标题】:Await returns [Function] instead of value 【发布时间】:2019-11-23 08:40:00 【问题描述】:

await 返回 [Function] 而不是值

尝试通过使用 async 和 await 函数从 firebase 返回查询的值。返回的结果是 [Function] 或未处理的承诺拒绝警告。 Promise、async 和 await 的新手,但我已经在几个网站上尝试了基本示例,大多数都有 resolve 和 reject 参数,我认为它们应该与 firebase 的 Promise 相同。

我尝试了 2 个不同的版本,但结果都不正确。

get_all_users:async function()
   ref = db.ref("/user_data");
   const value = await ref.orderByKey().on("child_added", function(data));
   console.log(value.val().name);

返回 UnhandledPromiseRejectionWarning

function get_async_users()
  ref = db.ref("/user_data");
  ref.orderByKey().on("child_added", function(data) 
    return data.val().name;
  );

返回未定义

期望其中之一从查询中返回名称。

【问题讨论】:

Firebase 文档是否说on 返回了一个承诺?根据函数名,返回似乎不太可能...... 【参考方案1】:

on 用于监听所有被触发的事件。因此它不返回 Promise,因为 Promise 代表一个可用的值,并且由于它不返回 Promise,所以您不能 await 它(或者至少:这样做没有意义,它是无操作的)。

如果你想等待第一次出现,有once,它也返回一个可以是awaited的promise。

关于 UnhandledPromiseRejection:您应该始终将异步代码包装到 try / catch(在 async function 内),或将 .catch 附加到链中最上面的 Promise,然后您可以正确处理这些错误。

【讨论】:

感谢乔纳斯。抱歉,我并不清楚“在”什么,并认为这是一个承诺。我怀疑这是一个承诺,因为返回的值是未定义的,我不得不“等待”结果出现。一次确实返回第一次出现,但如果我想要查询中的所有数据怎么办? 那么Firebase文档中可能有更合适的方法......

以上是关于Await 返回 [Function] 而不是值的主要内容,如果未能解决你的问题,请参考以下文章

异步函数返回承诺,而不是值

理解ES7中的async/await

从async / await nodejs返回多个值

使用 async/await 时,Firebase Cloud Firestore 查询返回 Promise <pending> 而不是已完成

为啥 async/await Axios 请求不会返回 Data 而不是 Promise 对象 [重复]

为啥 settings.split 返回 "" 而不是 <f:debug> 显示的预期数组值?