Избегайте вложенных функций, Google Cloud Function - PullRequest
1 голос
/ 30 марта 2019

Впервые в JavaScript, поэтому я ценю ваше терпение ... Я хочу написать облачную функцию Google, которая будет отправлять сообщение при записи в БД. Он должен получать данные из нескольких мест в БД. Ниже то, что у меня есть:

exports.NotifyNewApplication = functions.database
    .ref(`/Applications/{applicationId}/appWith`)
    .onCreate((snapshot, context) => {
        var applicationId = context.params.applicationId; 
        console.log('status',  applicationId); 
        var recieverId = snapshot.val();
        var database = admin.database().ref(`/Applications/${applicationId}`);
        return database.once('value').then(snapshot=>{
        var nameId= snapshot.child("dogId").val();
        console.log('status',  snapshot.child('nameId').val());
        console.log('status',  snapshot.child('appWith').val());
        var userDatabase = admin.database().ref(`/users/TopUsers/${recieverId}/token`)
        return userDatabase.once('value').then(snapshot=>{
        var token = snapshot.val();
        console.log('status',  snapshot.val());
        var nameDatabase = admin.database().ref(`/names/${nameId}/name`)
        return nameDatabase.once('value').then(snapshot=>{
        var Name= snapshot.val();
        const message = {
            notification: {
                title: 'Application Recieved',
                body: 'Somebody has put an application in for '+Name,
                icon: "default"
            },
        };
        return admin.messaging().sendToDevice(token,message).then((response) => {
            return console.log('Successfully sent message:', response);
        }).catch((error) => {
             return console.log('Error sending message:', error);
        });
        });
        });
        });
    });

Что работает, однако, я получаю предупреждение, которое говорит

  38:16  warning  Avoid nesting promises  promise/no-nesting
  42:16  warning  Avoid nesting promises  promise/no-nesting
  51:16  warning  Avoid nesting promises  promise/no-nesting
  51:16  warning  Avoid nesting promises  promise/no-nesting

, который говорит о вложенных обещаниях и смотрит на строки возврата для каждой области. Моя проблема в том, что я не могу понять, как развернуть возврат и получить такой же рабочий результат.

Буду признателен за любое руководство.

1 Ответ

0 голосов
/ 30 марта 2019

Вместо цепочки вызова promise.then() внутри обратного вызова, просто верните promise и включите .then() на внешнем уровне цепочки.

Поскольку у вас есть некоторые переменные, которые должны быть доступны в следующем then обратном вызове (например, nameId), вы можете использовать Promise.all, чтобы передать массив следующему обратному вызову в цепочке и включить в него такие переменные:

exports.NotifyNewApplication = functions.database
    .ref(`/Applications/{applicationId}/appWith`)
    .onCreate((snapshot, context) => {
        var applicationId = context.params.applicationId; 
        console.log('status',  applicationId); 
        var recieverId = snapshot.val();
        var database = admin.database().ref(`/Applications/${applicationId}`);
        return database.once('value')
            .then(snapshot=>{
                var nameId= snapshot.child("dogId").val();
                console.log('status',  snapshot.child('nameId').val());
                console.log('status',  snapshot.child('appWith').val());
                var userDatabase = admin.database().ref(`/users/TopUsers/${recieverId}/token`)
                return Promise.all([nameId, userDatabase.once('value')]);
            }).then(([nameId, snapshot])=>{
                var token = snapshot.val();
                console.log('status',  snapshot.val());
                var nameDatabase = admin.database().ref(`/names/${nameId}/name`)
                return Promise.all([token, nameDatabase.once('value')]);
            }).then(([token, snapshot])=>{
                var Name= snapshot.val();
                const message = {
                    notification: {
                        title: 'Application Recieved',
                        body: 'Somebody has put an application in for '+Name,
                        icon: "default"
                    },
                };
                return admin.messaging().sendToDevice(token,message);
            }).then((response) => {
                return console.log('Successfully sent message:', response);
            }).catch((error) => {
                return console.log('Error sending message:', error);
            });
...