Выполнение одновременных запросов Firebase с использованием обещаний - PullRequest
0 голосов
/ 24 июня 2018

Я пытаюсь выполнить несколько запросов Firebase Cloud Storage одновременно с помощью Promise.all ():

exports.onNewOrder = 
functions.database.ref('/orders/{orderId}').onCreate(event => {  
    const data = event.val();
    const orderedBy = data.ordered_by;
    const creations = data.creations;

    var promises = []
    for (var entry of creations.entries()) {
        var key = entry[0], value = entry[1];
        var creationPromise = admin.database().ref("creations/"+ key);
        creationPromise.once("value")
        .then((crSnapshot)=>{
            const crName = crSnapshot.val().name;
            const created = crSnapshot.val().created;
            return "crName+'\n'+created”;
        }).catch((error) => {
            console.log("creation details error : "+ error);
        });
        promises.push(creationPromise);
    }

    const userPromise = admin.database().ref("users/"+ orderedBy);
    userPromise.once("value")
    .then((snapshot) => {
        var name = snapshot.val().name;
        var email = snapshot.val().email;
        const userDetails = name+'\n'+email;
        return userDetails; 
    }).catch((error) => {
        console.log("user details error :"+ error);
    });

    promises.push(userPromise);

    return Promise.all(promises).then(results => {
        console.log("results: " + results)
        return true;
    }).catch((error) => {
        console.log("sendMail failed : "+ error);
    });
});

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

результаты:

https://....firebaseio.com/creations/cr_1bfd5f16212f44c792a2cbe3e9c6e4cc
https://....firebaseio.com/creations/cr_343c363c2a214487ba8cb7101653f6af
https://....firebaseio.com/creations/cr_e3f7a0bafd1542ac898d96e86155b94e
https://....firebaseio.com/users/us_5e4c28e18e63454c861caa5c4fe6a6f0

Я что-то упустил?

1 Ответ

0 голосов
/ 24 июня 2018

Следующее должно сделать трюк.

Как подробно здесь :

Метод Promise.all(iterable) возвращает одно Обещание, которое разрешается, когда все обещания в аргументе iterable имеют разрешен или когда аргумент iterable не содержит обещаний. Это отклоняет причину первого обещания, которое отклоняет.

Поэтому вам нужно добавить некоторые обещания в массив promises.

Метод once() возвращает обещание, как объяснено здесь в документе.

exports.onNewOrder = 
functions.database.ref('/orders/{orderId}').onCreate(event => {  
    const data = event.val();
    const orderedBy = data.ordered_by;
    const creations = data.creations;

    const promises = []

    for (var entry of creations.entries()) {
        var key = entry[0];
        var creationPromise = admin.database().ref("creations/"+ key).once("value");
        promises.push(creationPromise);
    }

    const userPromise = admin.database().ref("users/"+ orderedBy).once("value");
    promises.push(userPromise);

    return Promise.all(promises)
    .then(results => {
        console.log("results: " + results);
        return true;
        //actually here you will probably do something else than just write the results to the console. 
        //In this case you should return a promise (instead of true).
    }).catch((error) => {
        console.log("sendMail failed : "+ error);
        return false;
    });

});
...