【发布时间】:2019-12-06 18:24:47
【问题描述】:
我对 JavaScript 还很陌生,我发现 promises 和“then”语句的概念真的很难确定。我正在使用 Firebase 的网站上工作,并且正在尝试从数据库中获取用户数据。这是我目前拥有的:
// Function that fetches a user's data from the database.
getUserData = function(uid) {
var database = firebase.firestore();
var docRef = database.collection('users').doc(uid);
var userData = docRef.get().then(function(doc) {
if (doc.exists) {
return doc.data();
} else {
console.log("User does not exist.");
return null;
}
}).catch(function(error) {
console.log("Error getting document:", error);
});
return userData;
}
目前,此函数返回一个 Promise 对象。当我将对象记录到控制台时,它表示承诺状态已解决,其值是 doc.data() 的值。我真正想要的是将 doc.data() 的值通过“链”备份到 getUserData 函数,以便我可以返回并在其他地方使用它。有没有一种简单的方法可以做到这一点?我试图找到一种方法来从对象本身中获取 Promise 的“价值”,但我什么也没找到,到目前为止我还没有找到任何其他方法来做我想做的事。
我敢肯定它比看起来简单得多,而且我觉得问这种事情就像个白痴,但我已经搜索了几个小时,但我找到的解释都没有帮助.我将不胜感激任何建议。谢谢!
编辑:已解决!谢谢大家的帮助!以防万一这对将来偶然发现它的人有所帮助,我将把我的最终(工作)代码留在这里。不幸的是,无法从同步函数中调用它,但它最终足以满足我的目的:
// Function that fetches a user's data from the database.
async function getUserData(uid) {
var database = firebase.firestore();
var docRef = database.collection('users').doc(uid);
var doc = await docRef.get();
if (doc.exists) {
return doc.data();
} else {
console.log("User does not exist.");
return null;
}
}
【问题讨论】:
-
不,在返回时,promise 尚未解决 - 值是异步获取的。而且没有办法立即得到它们(没有时间机器)。你需要返回 Promise,并一直使用 Promise。
-
@Bergi 我认为他的意思是直接获得结果而不必使用
.then -
@jonatjano 是的,我是说这是不可能的。
-
@Bergi 有专门针对这个的 async/await
-
@jonatjano
await也使用then。async函数仍然返回一个承诺。它不会使任何东西同步,它只是then链的语法糖。
标签: javascript promise