等待多个承诺并从 Firebase 获取一些值
Await multiple promises and getting some values from Firebase
我希望这个问题不是重复的,但我是这么认为的。我在发布之前进行了研究,但我找到的答案对我没有帮助。
我正在使用 Firebase 在键 myKey
中保存字符串内容,因此结构类似于:
{ myKey: {
key1: an object stringified,
key2: an object stringified,
key2: an object stringified,
...
}
}
这是我的代码:
async fetchContent(documentId, sheetId) {
const json = await this.fetchSheetContent(documentId, sheetId, 'A:B')
const content = json.map(async (row) => {
const stringifiedContent = await readValue(new URL(row.URL).search) // obtain `an object stringified`
const parsedContent = JSON.parse(stringifiedContent)
return { row, parsedContent }
}
)
console.log(content) // <-- content is a pending Promise, I want instead an array of objects
// do something with the array of objects
// return content.map(c => {...)
}
async function readValue(search) {
const queryParams = new URLSearchParams(search)
const key = queryParams.get('myKey')
if (!key) return
const stringifiedState = await createSyncContent(STATE_KEY).get(key)
return stringifiedContent
}
const createSyncContent = (db) => {
const ref = fbDb.database().ref(db)
const syncContent = {
get: async (key) => {
try {
const snapshot = await ref.child(key).get()
if (snapshot.exists()) {
const value = snapshot.val()['myKey']
return value
} else {
console.log('ERROR')
}
} catch (error) {
console.error(error)
}
},
}
return syncContent
}
在该代码中 content
是一个未决的 Promise,我想要一个对象数组。哪里出错了?
非常感谢,我是 Promises 的初学者。
我试过了Promise.all
:
async fetchContent(documentId, sheetId) {
const json = await this.fetchSheetContent(documentId, sheetId, 'A:B')
const content = Promise.all(json.map(async (row) => {
const stringifiedContent = await readValue(new URL(row.URL).search)
const parsedContent = JSON.parse(stringifiedContent)
return { row, parsedContent }
}
))
// do something with the array of objects
// return content.map(c => {...)
}
和:
async fetchContent(documentId, sheetId) {
const json = await this.fetchSheetContent(documentId, sheetId, 'A:B')
const content = await json.map(async (row) => {
const stringifiedContent = await readValue(new URL(row.URL).search)
const parsedContent = JSON.parse(stringifiedContent)
return { row, parsedContent }
}
)
// do something with the array of objects
// return content.map(c => {...)
}
好像不行
你想念await
。试试这个:
const content = await json.map(async (row) => {...})
console.log(content)
据我了解 JS,当你在函数前使用 async 时,函数的 return 类型会变为 promise。
有什么问题:
const content = json.map(async (row) => {
const stringifiedContent = await readValue(new URL(row.URL).search) // obtain `an object stringified`
const parsedContent = JSON.parse(stringifiedContent)
return { row, parsedContent }
}
)
此处您在地图回调函数之前使用异步,因此您在内容中看到的地图 returns 未决承诺数组。
解法(可以多):
您可以使用 Promise.all 并行 运行 多个 api 请求并等待所有请求都得到解决。
缺点:如果任何承诺未能解决,它将失败。
解决方法:
供参考:Promise.all
我没有测试上面的答案。您也可以尝试一下,因为它简短易行。
我希望这个问题不是重复的,但我是这么认为的。我在发布之前进行了研究,但我找到的答案对我没有帮助。
我正在使用 Firebase 在键 myKey
中保存字符串内容,因此结构类似于:
{ myKey: {
key1: an object stringified,
key2: an object stringified,
key2: an object stringified,
...
}
}
这是我的代码:
async fetchContent(documentId, sheetId) {
const json = await this.fetchSheetContent(documentId, sheetId, 'A:B')
const content = json.map(async (row) => {
const stringifiedContent = await readValue(new URL(row.URL).search) // obtain `an object stringified`
const parsedContent = JSON.parse(stringifiedContent)
return { row, parsedContent }
}
)
console.log(content) // <-- content is a pending Promise, I want instead an array of objects
// do something with the array of objects
// return content.map(c => {...)
}
async function readValue(search) {
const queryParams = new URLSearchParams(search)
const key = queryParams.get('myKey')
if (!key) return
const stringifiedState = await createSyncContent(STATE_KEY).get(key)
return stringifiedContent
}
const createSyncContent = (db) => {
const ref = fbDb.database().ref(db)
const syncContent = {
get: async (key) => {
try {
const snapshot = await ref.child(key).get()
if (snapshot.exists()) {
const value = snapshot.val()['myKey']
return value
} else {
console.log('ERROR')
}
} catch (error) {
console.error(error)
}
},
}
return syncContent
}
在该代码中 content
是一个未决的 Promise,我想要一个对象数组。哪里出错了?
非常感谢,我是 Promises 的初学者。
我试过了Promise.all
:
async fetchContent(documentId, sheetId) {
const json = await this.fetchSheetContent(documentId, sheetId, 'A:B')
const content = Promise.all(json.map(async (row) => {
const stringifiedContent = await readValue(new URL(row.URL).search)
const parsedContent = JSON.parse(stringifiedContent)
return { row, parsedContent }
}
))
// do something with the array of objects
// return content.map(c => {...)
}
和:
async fetchContent(documentId, sheetId) {
const json = await this.fetchSheetContent(documentId, sheetId, 'A:B')
const content = await json.map(async (row) => {
const stringifiedContent = await readValue(new URL(row.URL).search)
const parsedContent = JSON.parse(stringifiedContent)
return { row, parsedContent }
}
)
// do something with the array of objects
// return content.map(c => {...)
}
好像不行
你想念await
。试试这个:
const content = await json.map(async (row) => {...})
console.log(content)
据我了解 JS,当你在函数前使用 async 时,函数的 return 类型会变为 promise。
有什么问题:
const content = json.map(async (row) => {
const stringifiedContent = await readValue(new URL(row.URL).search) // obtain `an object stringified`
const parsedContent = JSON.parse(stringifiedContent)
return { row, parsedContent }
}
)
此处您在地图回调函数之前使用异步,因此您在内容中看到的地图 returns 未决承诺数组。
解法(可以多):
您可以使用 Promise.all 并行 运行 多个 api 请求并等待所有请求都得到解决。
缺点:如果任何承诺未能解决,它将失败。
解决方法:
供参考:Promise.all
我没有测试上面的答案。您也可以尝试一下,因为它简短易行。