javascript - 在这种情况下,如何使用 Firebase Cloud Functions 避免承诺嵌套?
问题描述
我有一个 Android 应用程序,可以将电话号码列表发送到我项目中的云函数。然后,服务器应该检索用户的所有电话号码列表,获取两个数组之间的交集(相同元素),然后将交集数组中用户的 Firebase Auth 用户 ID 发送回应用程序。
这就是我想出的:-
// The Cloud Functions for Firebase SDK to create Cloud Functions and setup triggers.
const functions = require('firebase-functions');
// The Firebase Admin SDK to access the Firebase Realtime Database.
const admin = require('firebase-admin');
admin.initializeApp();
const auth = admin.auth();
const _ = require('underscore');
exports.getUids = functions.https.onCall((data, context) => {
return auth.listUsers().then(userRecords => {
var allPhoneNumbers = [];
userRecords.users.forEach(user => allPhoneNumbers.push(user.phoneNumber));
var phoneNumbers = _.intersection(allPhoneNumbers, data);
var Uids = [];
//the next line is where I am nesting promises
phoneNumbers.forEach(phoneNumber => auth.getUserByPhoneNumber(phoneNumber).then(user => Uids.push(user.uid)));
return Uids;
}).catch(error => console.error(error));
});
我从来没有用 JavaScript 编程过,但我正在尝试。现在已经2天了,我只是不知道如何解决这个问题。我已经尝试了至少 10 种不同的方法。我发现承诺真的很难处理。任何帮助表示赞赏。
解决方案
您可以使用Promise.all
来避免此问题。请注意,调用getUserByPhoneNumber
不等待完成。你必须连锁承诺等待它。这是一个带有常规 Promise 的实现:
return auth
.listUsers()
.then(userRecords => {
var allPhoneNumbers = [];
userRecords.users.forEach(user => allPhoneNumbers.push(user.phoneNumber));
var phoneNumbers = _.intersection(allPhoneNumbers, data);
return Promise.all(
phoneNumbers.map(phoneNumber => auth.getUserByPhoneNumber(phoneNumber))
);
})
.then(users => {
return users.map(user => user.uid);
})
.catch(error => {
console.error(error);
});
这是一个使用 async/await 的实现:
return auth
.listUsers()
.then(async userRecords => {
var allPhoneNumbers = [];
userRecords.users.forEach(user => allPhoneNumbers.push(user.phoneNumber));
var phoneNumbers = _.intersection(allPhoneNumbers, data);
const users = await Promise.all(
phoneNumbers.map(phoneNumber => auth.getUserByPhoneNumber(phoneNumber))
);
return users.map(user => user.uid);
})
.catch(error => {
console.error(error);
});
推荐阅读
- python - Django + tox:应用程序尚未加载
- google-apps-script - 从没有有限行定义的工作表发送非重复电子邮件
- angular - 等待订阅在 Angular 中完成
- java - 如何将屏幕保护程序添加到我的 javafx 应用程序?
- node.js - 如何在mongodb中实现like查询
- php - 未连接:Mac 上的潜在安全问题 laravel localhost
- reactjs - 如何使用带有 react redux 的 typescript 调用组件中的操作?
- jquery - 如何将生成的 graphviz svg 缩放到特定节点并滚动到元素?
- angular - 从具有特殊字符的 Url 角度获取参数
- c# - 将元素列表与另一个双打列表排序