почему мой javascript его использовать, чтобы долго работать? - PullRequest
0 голосов
/ 10 февраля 2019

Я работаю с облачными функциями для Firebase и получаю тайм-аут с некоторыми из моих функций.Я довольно новый с JavaScript.Похоже, мне нужно поместить for в обещание, и у меня возникают некоторые проблемы.Код на самом деле выходит из-за слишком рано, и я думаю, что он сделает это в течение длительного времени.Есть ли у вас способ улучшить этот код и сделать его быстрее?

exports.firebaseFunctions = functions.database.ref("mess/{pushId}").onUpdate(event => {
    //first i get event val and a object inside a firebase
    const original = event.data.val();
    const users = original.uids; // THIS ITS ALL USERS UIDS!!

    // so fist i get all users uids and put inside a array
    let usersUids = [];
    for (let key in users) {
        usersUids.push(users[key]);
    }

    // so now i gonna make a promise for use all this uids and get token's device 
    //and save them inside a another child in firebase!!
    return new Promise((resolve) => {
            let userTokens = [];
            usersUids.forEach(element => {
                admin.database().ref('users/' + element).child('token').once('value', snapShot => {
                    if (snapShot.val()) { // if token exist put him inside a array
                        userTokens.push(snapShot.val());
                    }
                })
            })
            resolve({
                userTokens
            })
        }) // now i make then here, from get userTokens and save in another child inside a firebase database
        .then((res) => {
            return admin.database().ref("USERS/TOKENS").push({
                userTokens: res,
            })
        })
})

1 Ответ

0 голосов
/ 10 февраля 2019

Вы делаете сетевые запросы с помощью firebase, поэтому, может быть, поэтому он медленный.Вы делаете один запрос на пользователя, поэтому, если у вас там 100 идентификаторов, это также может занять некоторое время.

Но я заметил еще одну проблему: вы просто решаете пустой список.Чтобы дождаться нескольких обещаний, создайте массив обещаний, а затем используйте Promise.all, чтобы создать обещание, которое ожидает всех из них параллельно.

Когда вы вызываете функцию решать, вы уже выполнили forEach, иВы выполнили все обещания, но они еще не добавлены в список.Чтобы сделать его лучше, наберите map и соберите все возвращенные обещания, а затем верните Promise.all.

...