Javascript 火基函数

Javascript 火基函数,javascript,firebase,google-cloud-functions,Javascript,Firebase,Google Cloud Functions,我正在建立一个像游戏一样的网站。现在我想每5分钟更新一次用户的统计数据(黄金等)。为此,我设置了一个cronjob,每5分钟运行一次,没问题。然而,看起来firebase函数可能会“挂起”,即使在它们的站点上,它们的运行时间大约为5毫秒 我刚刚发现,如果我在cronjob运行(函数运行)时“购买”,我看到“gold”可能不会得到更新,它会被设置回我开始购买时的状态 我的功能可以接受吗 绞刑在哪里?是因为我通过(现在有100个)假用户进行循环吗 如果是这样的话,为什么firebase会说主要需要5

我正在建立一个像游戏一样的网站。现在我想每5分钟更新一次用户的统计数据(黄金等)。为此,我设置了一个cronjob,每5分钟运行一次,没问题。然而,看起来firebase函数可能会“挂起”,即使在它们的站点上,它们的运行时间大约为5毫秒

我刚刚发现,如果我在cronjob运行(函数运行)时“购买”,我看到“gold”可能不会得到更新,它会被设置回我开始购买时的状态

  • 我的功能可以接受吗
  • 绞刑在哪里?是因为我通过(现在有100个)假用户进行循环吗
  • 如果是这样的话,为什么firebase会说主要需要5毫秒才能完成
  • 是否有任何方法可以确保,如果用户在函数将要安全时进行更新,那么该函数将更新最新的值

  • 因此,预期的结果当然是函数更新了用户的收入,尽管它确实更新了,但是它似乎“挂起”,并且由于用户在函数运行时“买东西”,它没有完全正确地更新。

    这是一个异步vs阻塞问题

    CalculateIncomePrivate是异步的,因此代码执行将前进到下一行,返回

    所以把你的函数改为

    function  CalculateIncomePrivate()
        return admin.database...
    
    然后这样称呼它:

    exports.CalculateIncome....
    return CalculateIncomePrivate().then(function(){
        resp....
    }).catch(function(error){
        resp.status(500).send(error);
    });
    
    确保返回任何已链接的承诺

    这将有助于你做出承诺

    这与Firebase功能有关

    使用事务可以防止您所说的更改。但是你读的书太多了!当
    units.worker
    更新时,可以为数据库设置一个触发器,而不是Cron作业HTTP触发器。另外,您可能希望使用
    返回开始
    CalculateIncomePrivate()
    。谢谢!这正是我想要的信息!非常感谢!
    exports.CalculateIncome....
    return CalculateIncomePrivate().then(function(){
        resp....
    }).catch(function(error){
        resp.status(500).send(error);
    });