2017-08-09 34 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()中承诺。没有必要为此创造新的承诺。 –