如何在firebase云功能中使用javascript setTimeout函数

Emi*_*own 7 javascript firebase google-cloud-functions

我正在尝试为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);
   };
Run Code Online (Sandbox Code Playgroud)

但是有人帮忙不行吗?

Mic*_*igh 8

你需要包装你setTimeout的承诺:

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);
  });
};
Run Code Online (Sandbox Code Playgroud)

请注意,等待setTimeout 花费的时间将作为函数执行时间计费,并且还受函数超时的影响.如果你只是延迟几秒钟,那可能没问题,但如果延迟预计是几分钟,那么这个解决方案就不可行或具有成本效益.

  • 您可以执行cron作业来定期调用一个函数,然后执行应该发生的动作。有关App Engine示例,请参见[this repo](https://github.com/firebase/functions-cron)。 (2认同)