Javascript 为什么我的Firebase脚本挂在终端上?

Javascript 为什么我的Firebase脚本挂在终端上?,javascript,node.js,firebase,firebase-realtime-database,Javascript,Node.js,Firebase,Firebase Realtime Database,我正在编写一个脚本来自动更新firebase,因为我需要每周运行一次 我有一个index.js文件,我正在运行node index.js来运行它,一切正常 我已经注释掉了很多代码,但现在我只是在运行 const calculateWinnings = () => { console.log('called me!') return firebaseApp .database() .ref(`data`) .once('valu

我正在编写一个脚本来自动更新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();
如果这样运行,您将看到数据库中的快照从未被记录

这也是如何正确处理它的答案:由于您已经从
calculateWinnings
方法返回了
once()
中的承诺,您可以等待该承诺完成,然后告诉流程退出:

calculateWinnings().then(() => {
  process.exit();
});
或者,如果您使用的是更现代的Node.js版本:

const calculateWinnings = async () => {
  ... the function body is the same as you currently have
}

await calculateWinnings()
process.exit();

嘿,红男爵。你有机会阅读我下面的答案并试一试吗?如果我的答案有用,请单击向上投票按钮(▲) 如果它回答了您的问题,请单击复选标记(✓) 接受它。这样别人就会知道你已经(足够)了帮助。也请看@FrankvanPuffelen谢谢你的回答。我无法再次查看代码,但我将尝试今晚/周末看一看,然后给出你的答案反馈。看起来应该有用tho!嘿,红色男爵。你有机会阅读我下面的答案并试一试吗?我实际上今晚要试一试,giv也会如果您尝试了第二个/第三个意想不到的代码段,那么您可以更新您的问题以显示您尝试了什么吗?