【发布时间】:2020-12-09 08:14:13
【问题描述】:
我是 JavaScript 新手,并且一直在尝试阅读很多关于为什么它不起作用。这是我的代码。我也在这里阅读了一些关于堆栈溢出的文章,但仍然感觉很密集
另外,如果我的标题没有意义,请提出修改建议
listRef.listAll()
.then(response => {
let files = []
response.items.forEach(item => {
var text
getText(item.name).then(res=>{text = res});
const id = {uid: guid()}
const url = item.getDownloadURL().then(url => {return url} )
const gsurl = `gs://archivewebsite.appspot.com/${folder}/${item.name}`
files.push({...item, name:item.name, url, gsurl, id:id.uid, text})
});
this.files = files;
})
.catch(error => console.log(error));
async function getText(docID) {
var docRef = firestore.collection("recipes").doc(docID);
let doc = await docRef.get()
if (doc.exists){
return doc.data().text
}
}
该代码“有效”,因为它将响应记录到控制台,但 text 变量是待处理的承诺对象。
我知道异步函数会返回一个承诺,所以当我调用 getText 时,我需要使用 .then - 我正在努力解决并多次重构此代码的是: 如何将 doc.data().text 的值分配给稍后使用的变量,换句话说,var text 如何成为实际字符串而不是待处理的承诺对象
如果我替换的话,也是为了我自己在异步函数中学习 javascript
if (doc.exists){
return doc.data().text
}
与
if (doc.exists){
return Promise.resolve(doc.data().text)
}
我在 console.log 中得到相同的结果 - 这是预期的吗? return 只是处理程序解决承诺的简写吗?
我还将这段代码重构为非异步的,我得到了相同的结果,其中我的 var 文本基本上是一个待处理的承诺,而不是解析的数据
感谢您的帮助 - 任何有助于向我解释这一点的文章都会很棒!我一直在学习udemy的课程,但现在对此有点困惑
【问题讨论】: