我正在使用 firebase 云函数,在其中定义变量 commentIdSpecific。当我将其记录在函数内时: -- console.log(comm id ${commentIdSpecific});
-- 它会打印其值。当我尝试在此处打印它时: -- console.log(test of variables inisde of post: ${usernameWhoOwnsThePost}, uwotpi: ${commentIdSpecific})
-- 它返回未定义。我看过三个谈论全局变量的网站,它似乎与我这里的没有任何不同。
如何让第二个打印语句中的值出现在第一个打印语句中?提前致谢。
var commentIdSpecific;
db.ref(`/users/${usernameWhoOwnsThePost}/posts/${usernameWhoOwnsThePostID}/comments`).once('value').then(snap => {
commentIdSpecific = snap.val();
let ids = [];
for (var id in snap.val()) {
ids.push(id);
}
let lastValueId = ids[ids.length - 1]
console.log(`last id value ${lastValueId}. UserPost: ${usernameWhoOwnsThePost}. user owner post id: ${usernameWhoOwnsThePostID}...`);
commentIdSpecific = lastValueId;
console.log(`comm id ${commentIdSpecific}`);
return commentIdSpecific;
}).catch(err => {
console.log(err);
});
var commentPoster;
db.ref(`/users/${usernameWhoOwnsThePost}/posts/${usernameWhoOwnsThePostID}/comments/${commentIdSpecific}/comment`).once('value').then(snap => {
commentPoster = snap.val();
console.log(`commentPoster: ${snap.val()}`);
console.log(`test of variables inisde of post: ${usernameWhoOwnsThePost}, uwotpi: ${commentIdSpecific}`)
return commentPoster
}).catch(err => {
console.log(err);
});
最佳答案
once()
是异步的,并立即返回一个 promise ,指示异步工作何时完成。同样,then()
立即返回并带有一个 promise 。每当查询结果完成时,您传递给 then() 的回调就会在一段未知的时间后执行。在此之前,您的代码将继续在下一行执行,这意味着 commentIdSpecific
在首次访问时将是未定义的。
您需要使用 promise 链来确保依赖于异步工作结果的工作仅在可用后才能访问。
您可能想观看本页面上有关 JavaScript Promise 的视频,以便更好地了解它们在 Cloud Functions 中的使用方式。了解它们如何编写有效的代码绝对至关重要。
关于javascript - 全局变量未传递 - Javascript FCF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51795795/