2017-08-09 37 views

回答

3

HTTP函數當前不遵守返回的承諾 - 它們需要發送結果才能正常終止。如果HTTP功能不發送結果,它將超時。

所有其他類型的函數都需要返回的承諾,以便等待異步工作完全完成。

如果您沒有任何異步工作需要等待,您可以立即返回。

這些是文檔中概述的三種情況。

+0

謝謝@Doug Stevenson 我們發送了res結果,但我們不確定如果HTTP函數在未返回異步代碼時保持活動狀態。對於我在這裏閱讀的文檔,它看起來好像HTTP函數需要返回異步併發送解析​​結果:https://firebase.google.com/docs/functions/terminate-functions –

+1

HTTP觸發器只需要發送響應。如果你需要使用承諾來協調你的工作,那就這樣做,但是從函數返回一個承諾是不會做任何事情的。您必須在代碼中的每個可能的終止點發送響應。 –

+0

完美,謝謝道格 –

0

你的雲功能,應該返回 「結束」 用下面的

res.redirect的(),res.send(),或res.end()

他們的意思是什麼通過返回promise,是否讓我們想象你有一個更新實時數據庫中的節點的雲功能,你想在響應HTTP請求之前完成這項工作。

實施例代碼

let RemoveSomething = functions.https.onRequest((req, res) => { 
    cors(req, res,() => { 
     // Remove something 
     DoDatabaseWork() 
      .then(function (result) { 
       res.status(200).send(); 
      }) 
      .catch(function (err) { 
       console.error(err); 
       res.status(501).send(); 
      }); 
    }); 
}); 

更新:新增DoDatabaseWork例子。

const DoDatabaseWork = function() { 
    return new Promise(function (resolve, reject) { 
     // Remove SomeNode 
     admin.database().ref('/someNode/').remove() 
      .then(function (result) { 
       resolve(); 
      }) 
      .catch(function (err) { 
       console.error(err); 
       reject(); 
      }); 
    }); 
} 
+0

第二個示例沒有顯示它是什麼類型的函數,但它不適用於HTTP函數。 HTTP功能目前不會觀察到任何返回的承諾。當功能完成時,它們只使用發送的結果作爲指示符。 –

+0

第一個代碼段是HTTP函數,它調用DoDatabaseWork「第二個示例」,並等待它完成數據庫工作「刪除節點」,然後HTTP函數返回狀態碼爲200或501。 – Kim

+0

您可以直接返回在這種情況下,從remove()中承諾。沒有必要爲此創造新的承諾。 –