我正在尝试调用以下函数。已经尝试了await和Promise.all(),但是在get请求返回之前,我仍然看到我的firebase函数执行完成。该代码最终完成,但是由于firebase的工作方式,它需要2到3分钟,因为firebase将其作为某种后台任务来运行。
我将日志记录在执行函数的每一行上。当到达调用(request.get)的行时,firebase停止并退出。我也尝试在此处添加await,但是代码不会阻塞并等待。
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);
});
});
}
答案 0 :(得分:0)
您正在将诺言与async
/ await
混合使用,这使得跟踪发生的事情甚至变得更加困难。我建议选择诺言或async
/ await
并仅使用它们。
纯粹的承诺,这段代码看起来像:
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);
});
});
});
}