javascript - Firebase 云功能在所有功能运行之前完成
问题描述
我正在尝试调用以下函数。已经尝试过 await 和 Promise.all() 但我仍然看到我的 firebase 函数在 get 请求返回之前执行完成。代码最终完成,但由于 firebase 的工作方式,它需要 2 或 3 分钟,因为 firebase 将其作为某种后台任务运行。
我已经在执行函数的每一行都记录了日志。当它到达调用 (request.get) 的行时,firebase 停止并退出。我也尝试在此处添加等待,但代码不会阻塞并等待。
function fetchUserLogoBase64(userId) {
return new Promise(async function(resolve, reject) {
const userSettings = await getDocument("user-settings", userId);
const downloadUrl = userSettings.company.logoDownloadUrl;
if (!downloadUrl) return null;
request.get(downloadUrl, function(error, response, body) {
if (!error && response.statusCode === 200) {
data =
"data:" +
response.headers["content-type"] +
";base64," +
new Buffer(body).toString("base64");
resolve(data);
}
reject(error);
});
});
}
解决方案
您将 promise 与async
/混合在一起await
,这使得使用任何一个都更难跟踪正在发生的事情。我建议选择 promises 或async
/await
并仅使用它。
使用纯 Promise,此代码将如下所示:
function fetchUserLogoBase64(userId) {
return new Promise(function(resolve, reject) {
getDocument("user-settings", userId).then(function(userSettings) {
const downloadUrl = userSettings.company.logoDownloadUrl;
if (!downloadUrl) resolve();
request.get(downloadUrl, function(error, response, body) {
if (!error && response.statusCode === 200) {
data =
"data:" +
response.headers["content-type"] +
";base64," +
new Buffer(body).toString("base64");
resolve(data);
}
reject(error);
});
});
});
}
推荐阅读
- java - 无法为硒自动化创建 Maven 项目
- java - 在 Eclipse 中将 Java 程序导出为带有其他文件的 JAR
- java - 如何将图像转换为字符串以将其读/写到 SQLite 数据库 - Android Studio (Java)
- r - R microbenchmark:如何将相同的参数传递给评估函数?
- mysql - 带2个主键的表怎么办?
- java - How to set spacing in Android GridLayout with Java?
- javascript - How does using a Proxy in js making a Promise look synchronous actually work?
- python - 烧瓶-sqlalchemy。电话号码类型
- splunk - 如何使用 rex 从日志文件中获取两个字段?
- siddhi - 表上的 SiddhiQL 复杂过滤条件