2017-04-19 61 views
0

我在特定時間觸發Firebase的Cloud功能。此功能正確啓動。如何取消正在進行的雲端功能?

當函數仍然需要執行時,在我的場景中,函數寫入的數據可能會被刪除。

所以在刪除數據之後,會創建一個帶有.update()數據的新路徑。

我該如何避免這種行爲?是否有一些函數可以調用來停止某個函數?

這是我的代碼示例。 情況現在的問題是關於兩個功能:

  1. 獲取Facebook的長期居住的道理,至極火災時,用戶首先loged中,只有Firebse給出了一個Facebook的accessToken :( 它看起來像:
 
     exports.getFacebookLongLivedAccessToken = functions.database.ref('/users/{uid}/...').onWrite(event => { 
     const accessToken = event.data; 

     if(event.data.val() !== null) { 
     const baseFBUrl = "https://graph.facebook.com/oauth/access_token?client_id=...&client_secret=...&grant_type=fb_exchange_token&fb_exchange_token=" 
     const fbAccessTokenUrl = baseFBUrl + accessToken.val(); 

     axios.get(fbAccessTokenUrl) 
      .then(function (response) { 
      return accessToken.ref.parent.update({accessTokenLongLived: response.data.access_token}); 
      }) 
      .catch(function (error) { 
      console.error(error); 
      return accessToken.ref.parent.update({accessTokenLongLived: error + ' - ' + fbAccessTokenUrl}); 
     }); 
     } else { 
     return; 
     } 
    }); 
  • 予提及的第二個功能,是用戶刪除,這看起來像:

    exports.cleanupUserData = functions.auth.user().onDelete(event => { 
        const uid = event.data.uid; 
        console.error(uid) 
        console.error(event.data) 
        return admin.database().ref('/users/' + uid).remove(); 
        //return uid.ref.parent.remove(uid); 
    }); 
    
  • 我知道;登錄和刪除後的變化不是很大,但我傾向於製作更多的功能並獲得更多的使用等等。所以對我來說,理解並正確理解這一點非常重要。

    +0

    我不知道我明白你的情況在這裏。你能編輯這個問題嗎?包括你正在使用的代碼,以及關於什麼不按你期望的方式工作的更多細節。 –

    +0

    @Doug,謝謝你的迴應。我添加了我的代碼。 – BushJopie

    +0

    我認爲現有的答案是你正在尋找的。您應該將某種標誌值寫回數據庫,以檢查第二次調用,以確定該位置的數據是否已經處理。是的,它仍然需要2個函數調用,而且團隊正在研究改進方法。 –

    回答

    0

    我認爲你可能會在這裏碰到的是與你的雲功能競爭的條件。

    基本上在一個地方或其他你需要做的要麼

    一)原子數據庫寫或

    二)檢查更新標誌,而不是執行更新。

    看一看這個鏈接https://youtu.be/7E13ZBCyKT0?t=5m

    5分鐘到視頻Jen Person介紹瞭如何確保更新不會觸發到數據庫,停留在一個無限循環。

    如果您分享一些代碼,我們可能都會有幫助。

    +1

    從技術上講,這不是「競賽條件」。這只是一個無限循環,需要一個退出條件來終止(你的「b」選項)。 –