Rob*_*ard 3 asynchronous function node.js google-cloud-firestore
我正在努力进行异步操作。我试图简单地从firestore中获取值并将其存储在var中。
我设法接收到该值,当我专门这样做时(甚至可以在get函数中使用var),甚至可以将其保存在var中,但是当尝试以灵活的方式保存它时,我似乎无法正确地管理await:
async function getValues(collectionName, docName,) {
console.log("start")
var result;
var docRef = await db.collection(collectionName).doc(docName).get()
.then(//async// (tried this as well with async) function (doc) {
if (doc.exists) {
console.log("Document data:", doc.data());
result = doc.data().text;
console.log(result);
return //await// (this as well with async) result;
} else {
// doc.data() will be undefined in this case
console.log("No such document!");
result = "No such document!";
return result;
}
console.log("end");
}).catch (function (err) {
console.log('Error getting documents', err);
});
};
helpMessage = getValues('configuration','helpMessage');
Run Code Online (Sandbox Code Playgroud)
注意:doc.data().text -> "text"是存储我的值的字段的名称。我必须在.value这里使用吗?
我在控制台中得到的结果是:
信息:文档数据:{文本:“来自数据库的正确文本”}
信息:来自数据库的正确文本
但是在我的代码中使用helpMessage
{}
来自Telegram机器人的图像,我试图在该图像中使用helpMessage作为对'/ help'命令的响应。
我已经检查:从云计算公司的FireStore获得价值, 火力地堡公司的FireStore得到()异步/ AWAIT,从火力参考的FireStore异步获取价值,最重要的我如何返回从一个异步调用的响应?。他们要么处理多个文档(使用forEach),要么不解决我的问题的异步性质,要么(最后一种情况),我只是无法理解它的性质。
此外,nodejs和firestore似乎都在快速发展,并且很难找到好的,最新的文档或示例。任何指针都非常有用。
你的事情走错了路。它比您想象的要容易得多。
function getValues(collectionName, docName) {
return db.collection(collectionName).doc(docName).get().then(function (doc) {
if (doc.exists) return doc.data().text;
return Promise.reject("No such document");
}};
}
Run Code Online (Sandbox Code Playgroud)
如果一个函数返回一个Promise(如db.collection(...).doc(...).get()),则返回该Promise。这是return上面的“外部” 。
在promise处理程序中(在.then()回调内部),返回一个值以指示成功,或者返回被拒绝的promise以指示错误。这就是return上面的“内在” 。throw如果您愿意,也可以返回错误,而不是返回被拒绝的承诺。
现在您有了一个兑现承诺的功能。您可以将其与.then()和一起使用.catch():
getValues('configuration','helpMessage')
.then(function (text) { console.log(text); })
.catch(function (err) { console.log("ERROR:" err); });
Run Code Online (Sandbox Code Playgroud)
或者在try / catch块中await的async函数内部,如果您更喜欢:
async function doSomething() {
try {
let text = await getValues('configuration','helpMessage');
console.log(text);
} catch {
console.log("ERROR:" err);
}
}
Run Code Online (Sandbox Code Playgroud)
如果要对getValues()函数使用异步/等待,则可以:
async function getValues(collectionName, docName) {
let doc = await db.collection(collectionName).doc(docName).get();
if (doc.exists) return doc.data().text;
throw new Error("No such document");
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
854 次 |
| 最近记录: |