NodeJS Promise Firebase - PullRequest
       22

NodeJS Promise Firebase

0 голосов
/ 14 октября 2018

Надо любить nodeJS и асинхронную природу!После этого я не знаю, как продолжить, потому что я не могу продолжать выполнять обещания, и, конечно, это не пойдет, поэтому я вскидываю руки, потому что каждый шаг требует выполнения действия с данными из предыдущего шага.

Это то, что я пытаюсь выполнить, и код приведен ниже.

  1. В / сессий / колледж вступает новый колледж
  2. После получения значения этого ключа,найдите советников, которые подписываются на этот колледж.
  3. Получите токены FCM для подписчиков
  4. Я даже не попал в эту часть, но отправьте уведомление FCM подписчикам.
  5. Тада!

exports.newSessionNotifer = functions.database.ref('/sessions/college').onCreate((snap, context) => {
    const college = snap.val(); 
    var promises = [];
    var getAdvisors = admin.database().ref('colleges').child(college).once('value').then((snapshot) => {
        const people = snapshot.val();
        var advisors = Object.keys(people);
        return advisors;
    }).then((advisors) => {
        return advisors.forEach((token) => {
            var advisorToken = admin.database().ref('users').child(token).child('fcmtoken').child('token').once('value');
            return console.log(advisorToken);
        });
    });

    return Promise.all(promises).then((values) => {
        console.log(promises);
        return console.log('Hi');
    });

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

Спасибо, Дэн, вот мой последний код.Комментарий / обратная связь прочь!Я решил отключить вариант размещения обещаний в lint и альте!

exports.newSessionNotifer = functions.database.ref('/sessions/{sessionID}/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);
    return advisors;
}).then((advisors) => {
    return advisors.map(advisor => {
            return admin.database().ref('users').child(advisor).child('fcmtoken').child('token').once('value').then((snapshot) => {
            const token = snapshot.val();
            const payload = {
                    notification: {
                    title: `There's a new session for ${college}!`,
                    body: 'Go to the middle tab and swipe right to accept the session before your peers do!'
                    }
            };
            return admin.messaging().sendToDevice(token, payload);
        });
    });
});
});
0 голосов
/ 14 октября 2018

Вы на правильном пути.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Я думаю, что ворс должен сообщать обо всем вышеперечисленном как просто отлично, даже с включенным предупреждением о вложенности обещания.

...