10

I'm trying to create a cloud function for firebase that remove a user depending on the delay value and insert back the after the number of delay.

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);
   };

But it's not working can someone help?

1 Answer 1

12

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);
  });
};

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.

Sign up to request clarification or add additional context in comments.

2 Comments

the delay is expected to me minutes. is they any solution for it?
You could make a cron job to call a function periodically and then perform actions that should have happened. See this repo for an App Engine example.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.