Firebase Realtime DB中.push()创建节点后需等待Promise吗?代码是否有问题?
关于Firebase Realtime DB的两个疑问解答
一、使用.push()创建空数据条目后,是否必须解析Promise再写入?
不需要。核心原因有两点:
push()生成的节点key是客户端本地生成的,基于时间戳和随机因子,无需和服务器交互就能确定,拿到新节点的引用后,直接用它做后续写入完全没问题。- Firebase SDK会自动对同一个客户端发起的所有写入请求按顺序排队,哪怕不等待
push()相关的Promise,后续写入该节点的请求也会排在创建请求之后,不会出现“写入先于创建”的情况。
二、不等待.push()的Promise就直接写入子节点,会不会有问题?
这段代码是安全的,不存在你担心的时序bug,理由如下:
- 如前所述,
push()的key是本地生成的,拿到新节点的引用后,就能直接定位到该节点,无需等服务器确认创建操作。 - Firebase SDK会对同一客户端的写入请求做有序处理,“创建空节点”和“写入子条目”的请求会按调用顺序发送给服务器,不会乱序执行。
- 补充说明:Firebase里没有真正的数组,所谓的“数组”其实是按push key排序的对象,
push()生成的key本身带有排序属性,即便写入操作异步完成,最终数据的顺序也能得到保证。
举个直观的例子,哪怕这么写也没问题:
const newListRef = admin.database().ref('lists').push(); // 生成新引用,此时还没发请求 // 直接循环写入子条目 for (let i = 0; i < 5; i++) { newListRef.child(i.toString()).set({ value: i }); }
SDK会先发送创建newListRef节点的请求,再依次发送子条目的写入请求,服务器会按顺序处理,不会出现子条目找不到父节点的情况。
内容的提问来源于stack exchange,提问作者Mawg
相关产品推荐
相关产品推荐

