2017-06-01 170 views
2

我試圖爲firebase創建一個雲端函數,根據延遲值移除用戶,並在延遲後插入回數。如何在firebase雲端函數中使用javascript 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(); 
    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); 
    }; 

但它不起作用有人可以幫忙嗎?

回答

4

你需要換你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); 
    }); 
}; 

注意時間花在等待的setTimeout 被譽爲函數執行時間,也是受功能超時。如果你只延遲了幾秒鐘,那可能會好起來,但如果延遲時間預計爲幾分鐘,這種解決方案將不可行或具有成本效益。

+0

延遲時間預計爲幾分鐘。他們是否有任何解決方案? – Emibrown

+0

您可以定期調用一個cron作業,然後執行應該發生的操作。有關App Engine示例,請參見[本回購](https://github.com/firebase/functions-cron)。 –