Как избежать вложенных обещаний? - PullRequest
0 голосов
/ 13 мая 2018

Я пытаюсь написать функцию firebase, и мне интересно, есть ли способ избежать вложенных обещаний в этом коде JavaScript?

exports.sendNotification=functions.database.ref('/notifications/{user_id}/{notification_id}').onWrite((change,context)=>{

const userId=context.params.user_id;
const notificationId=context.params.notification_id;

console.log('We have a notification to send to: ', userId);

if(!change.after.val()){
    return console.log('A notification has been deleted from database ',notificationId);
}
const fromUser=change.after.ref.root.child("/notifications/"+userId+"/"+notificationId).once('value');
return fromUser.then(fromUserResult=>{
    const fromUserID=fromUserResult.val().from;
    console.log('You have new notification from'+fromUserID);

    const userQuery=change.after.ref.root.child(`users/${fromUserID}/name`).once('value');
    const deviceToken=change.after.ref.root.child("/users/"+userId+"/device_token").once('value');

    return Promise.all([userQuery, deviceToken]).then(resut=>{

        const userName=resut[0].val();
        const token_id=resut[1].val();

        const payload={
            notification:{
                title: "Friend request",
                body: `${userName} has send you request`,
                icon: "default",
                click_action: "com.mwdevp.android.lapitchat_TARGET_NOTIFICATION"
            },
            data :{
                USER_KEY: fromUserID
            }
        };

        return admin.messaging().sendToDevice(token_id,payload).then(response=>{
        console.log('This was the notification feature');
        return;
        });

    });
});
});

Кто-нибудь знает, как можно избежать вложенных обещаний в этом коде?

Ответы [ 2 ]

0 голосов
/ 13 мая 2018

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

return fromUser.then(fromUserResult=>{
    const fromUserID=fromUserResult.val().from;
    console.log('You have new notification from'+fromUserID);

    const userQuery=change.after.ref.root.child(`users/${fromUserID}/name`).once('value');
    const deviceToken=change.after.ref.root.child("/users/"+userId+"/device_token").once('value');

    return Promise.all([userQuery, deviceToken, fromUserID]); // <--- add third value
}).then(resut=>{
    const userName=resut[0].val();
    const token_id=resut[1].val();

    const payload={
        notification:{
            title: "Friend request",
            body: `${userName} has send you request`,
            icon: "default",
            click_action: "com.mwdevp.android.lapitchat_TARGET_NOTIFICATION"
        },
        data :{
            USER_KEY: resut[2]; // <----
        }
    };

    return admin.messaging().sendToDevice(token_id,payload);
}).then(response=>{
    console.log('This was the notification feature');
    return;
});
0 голосов
/ 13 мая 2018

В ES7 вы можете обернуть весь код вокруг функции async и использовать await:

async function f() {
  ...
  const fromUserResult = await change.after.ref.root.child(...);
  ...
  const resut = await Promise.all(...);
  const userName = resut[0].val();
  ...
}

f();

Вам необходимо быть на версии Node> = 7 или использовать Babel .

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