javascript - 为什么我的 Firebase 脚本挂在终端上?
问题描述
我正在编写一个脚本来自动更新firebase,因为我需要每周运行一次
我有一个 index.js 文件,我正在node index.js
运行它,一切都很好
我已经注释掉了很多代码,但现在我只是在运行
const calculateWinnings = () => {
console.log('called me!')
return firebaseApp
.database()
.ref(`data`)
.once('value')
.then((snapshot) => {
console.log('snaph::', snapshot.val())
return
})
}
calculateWinnings()
这是我所期望的,它正在运行函数并从firebase返回数据
但是,脚本挂起并且永远不会在终端中退出并显示光标标记
当我注释掉firebase的东西时,它会达到我的预期
所以我想知道如何成功退出脚本或为什么它挂起?我要兑现承诺,所以它应该解决?
解决方案
Firebase SDK 在后台线程中执行所有网络和磁盘活动。calculateWinnings()
返回时,实际上then((snapshot) => {
还没有调用。出于这个原因,程序还没有退出是件好事,否则你永远不会看到console.log('snaph::', snapshot.val())
.
通过强制程序退出,您可以看到这一点:
const calculateWinnings = () => {
console.log('called me!')
return firebaseApp
.database()
.ref(`data`)
.once('value')
.then((snapshot) => {
console.log('snaph::', snapshot.val())
return
})
}
calculateWinnings()
process.exit();
如果你像这样运行它,你会看到数据库中的快照永远不会被记录。
这也是如何正确处理它的答案:因为您已经once()
从您的calculateWinnings
方法中返回了 Promise,您可以等待它完成然后告诉进程退出:
calculateWinnings().then(() => {
process.exit();
});
或者,如果您使用的是更现代的 Node.js 版本:
const calculateWinnings = async () => {
... the function body is the same as you currently have
}
await calculateWinnings()
process.exit();
推荐阅读
- javascript - PHP 会话数据未在 HTTPS 环境的同一域内从页面传输到页面
- python - 在 Python 中创建自定义枚举
- android - 在三星 S 系列或谷歌像素设备上找不到钛加速器相机
- python - 在辅助驱动器上安装 Anaconda (Windows)
- javascript - 带有 dotenv 和 nodejs 的未定义 process.env 变量
- android - 是否可以在没有任何服务器(仅本地文件)的情况下使用 chaquopy 在项目中包含库?
- python - 在有限制的公共整数上合并对
- ios - 飞行模式下的 MapKit
- css - 更改角材料选择列表中的复选框大小
- javascript - Modal 中的表格是每一行而不是单独填充的