【问题标题】:how to use javascript setTimeout function in firebase cloud functions如何在firebase云函数中使用javascript setTimeout函数
【发布时间】:2017-11-02 22:21:14
【问题描述】:

我正在尝试为 firebase 创建一个云函数,该函数根据延迟值删除用户并在延迟数之后插入回。

exports.delayqueue = functions.database.ref('/queues/{queueid}/members/{memberid}').onWrite(event => {

var members = event.data.ref.parent;
var user = event.data;
var queueid = members.parent;
var userid = event.params.memberid;
var delayfor = user.child('delay').val();
var name = user.child('name').val();

if(delayfor != 0){
  members.child(event.params.memberid).remove();
  join(userid,queueid,delayfor,name);
  return;
}else{
 return;
}
});

function join(userid,queueid,delayfor,name){
  setTimeout(function(){
   var ref = db.ref("queues/queueid/members/userid");
    ref.set({
    name: name,
    timestamp: Date.now(),
    delay : 0
    });
   }, delayfor*1000);
   };

但它不起作用,有人可以帮忙吗?

【问题讨论】:

    标签: javascript firebase google-cloud-functions


    【解决方案1】:

    您需要将 setTimeout 包装在 Promise 中:

    exports.delayqueue = functions.database.ref('/queues/{queueid}/members/{memberid}').onWrite(event => {
      var members = event.data.ref.parent;
      var user = event.data;
      var queueid = members.parent;
      var userid = event.params.memberid;
      var delayfor = user.child('delay').val();
      var name = user.child('name').val();
    
      if (delayfor !== 0){
        members.child(event.params.memberid).remove();
        return join(userid,queueid,delayfor,name);
      } else {
        return;
      }
    });
    
    function join(userid,queueid,delayfor,name){
      return new Promise((resolve, reject) => {
        setTimeout(function(){
          var ref = db.ref("queues/queueid/members/userid");
          ref.set({
            name: name,
            timestamp: Date.now(),
            delay : 0
          }).then(resolve, reject);
        }, delayfor*1000);
      });
    };
    

    请注意,等待 setTimeout 所花费的时间计费为函数执行时间,并且还受函数超时的影响。如果您只是延迟几秒钟,那可能没问题,但如果预计延迟是几分钟,那么这个解决方案将不可行或不划算。

    【讨论】:

    • 预计会延迟几分钟。他们有什么解决方案吗?
    • 您可以创建一个 cron 作业来定期调用一个函数,然后执行应该发生的操作。有关 App Engine 示例,请参阅 this repo
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-23
    • 2019-01-18
    • 1970-01-01
    • 2018-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多