Вы на правильном пути.once()
возвращает обещание, и это набор обещаний от повторных вызовов до одного раза, который необходимо собрать и запустить с помощью Promise.all()
.
exports.newSessionNotifer = functions.database.ref('/sessions/college').onCreate((snap, context) => {
const college = snap.val();
return admin.database().ref('colleges').child(college).once('value');
}).then(snapshot => {
const people = snapshot.val();
let advisors = Object.keys(people);
let promises = advisors.map(token => {
return admin.database().ref('users').child(token).child('fcmtoken').child('token').once('value');
});
return Promise.all(promises);
});
РЕДАКТИРОВАТЬ Повторное редактирование, этовремя с ответом ОП в руках.Что касается стиля, я не уверен, что говорит Линт, но мое определение плохого стиля вложения заключается в том, что блок then()
содержит другой блок then()
.Что касается стиля, мой подход к тому, чтобы сделать этот материал понятным, состоит в том, чтобы создавать (и тестировать) небольшие функции, по одной на асинхронную задачу.
В структуре новый ответ OP излишне связывает второй блок после return advisors
.Так как советники не обещают, мы можем продолжить с синхронным кодом.Также по структуре решение OP создает серию обещаний - по два для каждого советника (получить токен советника и push) - но они не обязательно будут выполнены, если Promise.all не будет применен и возвращен.
Суммированиевсе это, мой совет будет следующим:
При создании, получить советники для колледжа, отправить каждому сообщение.
exports.newSessionNotifer = functions.database.ref('/sessions/{sessionID}/college').onCreate((snap, context) => {
const college = snap.val();
return advisorsForCollege(college).then(advisors => {
let promises = advisors.map(advisor => sendAdvisorMessage(advisor, college));
return Promise.all(promises);
});
});
Советники для колледжа, очевидно, являются ключамиот этого объекта колледжа
function advisorsForCollege(college) {
return admin.database().ref('colleges').child(college).once('value').then(snapshot => Object.keys(snapshot.val()));
}
Отправка сообщения советника означает получение жетона советника и выполнение толчка.Верните цепочку из двух обещаний, которая делает это ...
function sendAdvisorMessage(advisor, college) {
return tokenForAdvisor(advisor).then(token => {
let title = `There's a new session for ${college}!`;
let body = 'Go to the middle tab and swipe right to accept the session before your peers do!'
return sendToDevice(token, title, body);
});
}
Теперь нам просто нужен один, чтобы получить токен советника, и один, чтобы сделать пуш ...
function tokenForAdvisor(advisor) {
return admin.database().ref('users').child(advisor).child('fcmtoken').child('token').once('value');
}
function sendToDevice(token, title, body) {
const payload = { notification: { title: title, body: body } };
return admin.messaging().sendToDevice(token, payload);
};
IЯ думаю, что ворс должен сообщать обо всем вышеперечисленном как просто отлично, даже с включенным предупреждением о вложенности обещания.