gpt4 book ai didi

javascript - 通过 Promises 返回的 Firebase 多个异步请求

转载 作者:行者123 更新时间:2023-11-30 14:00:42 25 4
gpt4 key购买 nike

我有一个 Firebase 函数,它试图获取一组 UID 并返回一组用户对象。我正在尝试使用 Promise.all() 返回所有异步结果,但返回的是一个空数组。然而,事后我得到了注销的结果。

const fetchUserObjects = function(uids){
let promises = []
uids.forEach((uid) => {
admin.database().ref(`/users/${uid}`).once("value")
.then(function(dataSnapshot) {
const userDataAll = dataSnapshot.val()
const userData = {}
userData.id = userDataAll.id
userData.username = userDataAll.username
userData.first = userDataAll.first
userData.last = userDataAll.last

promises.push(userData)
console.log(userData)
})
.catch((error) => {
// Re-throwing the error as an HttpsError so that the client gets the error details.
throw new functions.https.HttpsError('unknown', error.message, error);
});
})

return Promise.all(promises);

}

return fetchUserObjects(uids)

最佳答案

fetchUserObjects 总是返回一个空数组。在将值插入数组之前,没有什么能确保由 once() 启动的异步工作完成。另请注意,您实际上并没有将 promises 插入该数组。您正在推送普通的旧 JavaScript 对象。您需要将实际的 promise 推送到数组中,并且您需要在不必等待其他 promise 解决的情况下执行此操作。它应该是这样的:

const fetchUserObjects = function(uids){
let promises = []
uids.forEach((uid) => {
const promise = admin.database().ref(`/users/${uid}`).once("value")
.then(function(dataSnapshot) {
const userDataAll = dataSnapshot.val()
const userData = {}
userData.id = userDataAll.id
userData.username = userDataAll.username
userData.first = userDataAll.first
userData.last = userDataAll.last

console.log(userData)
return userData
})
.catch((error) => {
// Re-throwing the error as an HttpsError so that the client gets the error details.
throw new functions.https.HttpsError('unknown', error.message, error);
});

promises.push(promise)

})

return Promise.all(promises);

}

请注意,一个 promise 会立即被插入 promises 数组,并且它将使用 then 回调返回的 userData 对象进行解析。

关于javascript - 通过 Promises 返回的 Firebase 多个异步请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56364600/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com