3

我有一個HTTP觸發函數,每次調用端點時都會返回一個增量數。代碼如下所示:如何確保函數的執行順序?

export const reserve = functions.https.onRequest((req, resp) => { 
    cors(req, resp, async() => { 
    if (req.method.toLowerCase() !== 'post') { 
     resp.status(405); 
     resp.end(); 
    } else { 
     const path = `counter`; 
     const ref = firebase.database().ref(path); 
     const oldCount = (await ref.once('value')).val(); 
     await ref.set(oldCount + 1); 
     resp.status(200).send({ 
     number: oldCount 
     }); 
     resp.end(); 
    } 
    }); 
}); 

問題是,如果2個調用是非常接近對方,有沒有機會,該函數可以返回相同的號碼?如果是這樣,有沒有辦法來防止這種情況?

+0

因爲JavaScript是單線程的,因此它可以可以給同一個號碼。 –

回答

2

是的,你是對的,可以有這樣的問題。我不熟悉firebase,但是尋找一些可以讓你直接在firebase中增加這個數字的東西,而不必先取得它。這將是一次原子操作,並確保您不會遇到您描述的問題。

如果這對於firebase是不可能的,那麼您可能需要在中間設置一個服務器,以保持計數器的記錄。每次您想要增加/減少數字時,請求都會通過您的服務器,它先對緩存執行操作,然後通過調用Firebase API來完成請求。

更新: 這裏是如何Firebase recommends this

ref.transaction(function (current_value) { 
    return (current_value || 0) + 1; 
});