Обещания должны быть обработаны соответствующим образом ошибки - PullRequest
0 голосов
/ 23 октября 2019

Я пытаюсь написать эту функцию на основе таймера. Раз в неделю он должен запускаться и создавать практически дубликаты существующих документов. Каждый раз, когда я пытаюсь запустить его, я получаю сообщение об ошибке «Обещания должны быть обработаны надлежащим образом», но я не могу понять, что я делаю неправильно? На любом этапе возможен возврат. Где есть обещания, которые я не выполняю?

Ранее я запустил около 40 облачных функций, поэтому у меня есть некоторое представление о том, как работают обещания, но я, очевидно, что-то здесь упускаю, и дляжизнь моя, я не могу понять, что это такое.

Это функция:

exports.createRecurringDeals = functions.pubsub.schedule('0 0 * * 7').timeZone('Asia/Jerusalem').onRun((context) => {
    db.collection('recurring_deals').get().then(querySnapshot => {

        querySnapshot.forEach(bus => {
            const businessListDoc = bus.data();

            if (businessListDoc !== undefined) {
                const dealsList = businessListDoc.list as Array<String>

                return db.doc('businesses/' + bus.id).get().then(busDoc => {

                    const business = busDoc.data();

                    if (business !== undefined) {

                        dealsList.forEach(deal => {
                            return db.doc('deals/' + deal).get().then(snapshot => {
                                const oldDeal = snapshot.data();
                                if (oldDeal !== undefined) {

                                    const promises: any = [];

                                    const startTime = oldDeal.startTime + oldDeal.interval;
                                    const endTime = oldDeal.endTime + oldDeal.interval;

                                    const newDealDoc = db.collection('deals').doc();

                                    const newDeal = {
                                        id: newDealDoc.id,
                                        business_ID: business.id,
                                        business_name: business.name,
                                        business_address_text: business.address_text,
                                        business_address_lat: business.address_lat,
                                        business_address_long: business.address_long,
                                        business_phone_number: business.phone_number,
                                        business_image: business.restaurant_photos[0],
                                        business_categories: business.categories,
                                        business_sub_categories: business.sub_categories,
                                        discount: oldDeal.discount,
                                        timestamp_start: startTime,
                                        timestamp_end: endTime,
                                        gmt: oldDeal.gmt,
                                        amount: oldDeal.amount,
                                        claimers: [],
                                        active: true
                                    };

                                    promises.push(newDealDoc.set(newDeal));

                                    promises.push(db.doc('recurring_deals/' + business.id).update({ list: FieldValue.arrayRemove(oldDeal.id) }));

                                    promises.push(db.doc('recurring_deals/' + business.id).update({ list: FieldValue.arrayUnion(newDeal.id) }));

                                    return Promise.all(promises);

                                } else {
                                    return null;
                                };
                            });
                        });
                        return null;
                    } else {
                        return null;
                    };
                });
            } else {
                return null;
            };
        });
        return null;
    });
});

Ответы [ 2 ]

1 голос
/ 23 октября 2019

давайте начнем с того, что каждое обещание имеет для обработки - либо .catch, либо .then. Итак, первое, что вам не хватает - это обработчик вызова Promise.all(), который у вас ближе к концу.

Кроме того, в последних версиях JS у вас есть для размещения блока catch после язвы для обработки отказа, даже если он ничего не делает и даже если у вас есть .then. Здесь вы пропускаете .catch как для основного обещания сверху (db.collection('recurring_deals').get()), так и для вызова promise.all().

Добавьте их, и ошибка должна исчезнуть.

1 голос
/ 23 октября 2019

Я предполагаю, что он хочет, чтобы вы добавили предложение .catch() после .then на случай, если Обещание не выполнится по какой-либо причине. Например, попробуйте изменить

return db.doc('deals/' + deal).get().then(snapshot => {
    ...
});

на

return db.doc('deals/' + deal).get().then(snapshot => {
    ...
}).catch(err => console.log(err));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...