且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

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

更新时间:2022-05-11 04:12:24

你需要在承诺中包装你的 setTimeout

You'll need to wrap your setTimeout in a 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 所花费的时间将计入功能执行时间并且还受功能超时的影响。如果你只是推迟几秒钟,那可能没问题,但是如果延迟预计会是几分钟,那么这个解决方案就不可行或具有成本效益。

Note that the time spent waiting for setTimeout is billed as function execution time and is also subject to the function timeout. If you're only delaying a few seconds, that might be okay, but if the delay is expected to be minutes this solution isn't going to be viable or cost-effective.