2017-06-01 3 views
2

Ich versuche, eine Cloud-Funktion für Firebase erstellen, die einen Benutzer abhängig von der Verzögerung entfernen und den Wert nach der Anzahl der Verzögerung einfügen.wie JavaScript Javascript SetTimeout Funktion in Firebase Cloud-Funktionen

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

Aber es funktioniert nicht kann jemand helfen?

Antwort

4

Sie werden Ihre setTimeout in einem Versprechen wickeln müssen:

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

Beachten Sie, dass die Zeit für SetTimeout warten verbrachte als Funktion Ausführungszeit in Rechnung gestellt und ist auch abhängig von der Funktion Timeout. Wenn Sie nur ein paar Sekunden verzögern, kann das in Ordnung sein, aber wenn die Verzögerung Minuten beträgt, wird diese Lösung nicht praktikabel oder kosteneffektiv sein.

+0

wird die Verzögerung zu mir Minuten erwartet. Gibt es dafür eine Lösung? – Emibrown

+0

Sie könnten einen Cron-Job erstellen, um eine Funktion regelmäßig aufzurufen, und dann Aktionen ausführen, die eigentlich hätten ausgeführt werden sollen. Ein Beispiel für eine App Engine finden Sie unter [this repo] (https://github.com/firebase/functionscron). –