我正在嘗試獲取所有者變數,并且由于該函式通常將其作為未定義回傳,因此我決定使用 async/await 但我不能在另一個函式中使用 await 并且我可以訪問它之外的變數。有沒有簡單的解決方案,還是我必須重新設計該功能?
async getOwner() {
database.collection("users").doc(this.owner).get().then(data => {
var owner = new Promise(function (resolve, reject) {
resolve(new User(data.data().username, "", data.data().email, [], data.data().info))
})
let result = await owner
return result
})
}
uj5u.com熱心網友回復:
如果您使用的是 async/await,則幾乎不需要使用then()or new Promise()。您可以簡單地寫這個,等待回傳的承諾get():
async function getOwner() {
const snapshot = await database.collection("users").doc(this.owner).get()
const data = snapshot.data()
return new User(data.username, data.email, [], data.info)
}
您可能還應該撰寫代碼來檢查快照中是否有任何資料,并決定如果未找到檔案中看到的檔案該怎么做。
您可能想查看 async/await 的作業原理以便有效地使用它。
https://javascript.info/async-await
uj5u.com熱心網友回復:
雖然 Doug 的答案是更好的解決方案(因此我對此表示贊成),但我想指出為什么您當前的方法不起作用,這是因為您沒有從頂級代碼回傳任何內容。
因此,如果您不想使用await,最接近您當前代碼作業的方法是:
function getOwner() {
// ?? Add return here
return database.collection("users").doc(this.owner).get().then(data => {
var owner = new Promise(function (resolve, reject) {
resolve(new User(data.data().username, "", data.data().email, [], data.data().info))
})
let result = await owner
return result
})
}
而更簡單的版本,擺脫了額外的代碼:
function getOwner() {
return database.collection("users").doc(this.owner).get().then(doc => {
return new User(doc.data().username, "", doc.data().email, [], doc.data().info)
})
}
需要頂層return,因為它允許嵌套回傳“冒泡”并回傳到呼叫getOwner.
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/442111.html
標籤:javascript 火力基地 谷歌云火库 异步等待
下一篇:回傳具有相似結構但已過濾的物件
