Почему оператор catch внутри кода не перехватывает ошибку в асинхронной функции? - PullRequest
1 голос
/ 19 июня 2019

У меня есть .then в возвращении обещания, и в этом я определил асинхронную функцию, которая получает некоторые данные из API.Часть, в которой я застрял, заключается в том, что когда я выкидываю ошибку (принудительно), она не перехватывается блоком catch.

Из того, что я узнал, достаточно одного .catch для всех операторов .then.Это потому, что внутри кода есть другая асинхронная функция и, следовательно, .catch не работает?

CampaignController.getOnboardingCampaignList = (req,res) => {

    return OnBoardingCampaign.find({description : {$exists : true}},{name: 1, description : 1, suggestedHaikuIds : 1})
    .then((r) => {
      // Some Logic here, unrelated the the work done below

        async function getSuggestedHaiku(){
            for(const campaign of r ){
                let suggestedHaikuIds = [];
                campaign.suggestedHaikus = [];
                throw new Error; // Using this to throw the new error
                if(campaign.suggestedHaikuIds === '') campaign.suggestedHaikuIds = [];
                else{
                    campaign.suggestedHaikuIds.forEach((id) => {
                        suggestedHaikuIds.push(Helper.parseId(id))
                    }) // This particular line threw the error initially
                    const result = await SuggestedHaiku.find({_id: {$in : suggestedHaikuIds}},{timeStamp : 0, deleted : 0, returnCount : 0, writtenCount : 0});

                    campaign.suggestedHaikus = result;
                }

            }

            if(r.length === 0){
                return Promise.reject(1001);
            }else{
                let result = {};
                result.list = r;
                Helper.success(res,"Onboarding Campaign List",result);
            }
        }
        getSuggestedHaiku();    


    })
    .catch(err => Helper.error(res, err)) // This catch did not catch the error thrown above

}

Сообщения об ошибках:

UnhandledPromiseRejectionWarning: Ошибка в getSuggestedHaiku (/ Users / abhinav/haikuserver/controllers/campaign.js:242:23) в OnBoardingCampaign.find.then (/Users/abhinav/haikuserver/controllers/campaign.js:263:9) в process._tickCallback (внутренний / process / next_tick.js):68: 7) warning.js: 18 (узел: 7646) UnhandledPromiseRejectionWarning: необработанное отклонение обещания.Эта ошибка возникла либо из-за того, что внутри асинхронной функции не был выполнен блок catch, либо из-за отклонения обещания, которое не было обработано с помощью .catch ().(id отклонения: 2) warning.js: 18 (узел: 7646) [DEP0018] DeprecationWarning: Необработанные отклонения обещания устарели.В будущем отклонения обещаний, которые не обрабатываются, завершат процесс Node.js с ненулевым кодом выхода.

Ответы [ 2 ]

0 голосов
/ 19 июня 2019

Try catch должен быть перенесен в цикл for.

try{

      for(const campaign of r ){}

}catch() {}
0 голосов
/ 19 июня 2019

Javascript выполняет команды, не обязательно ожидая завершения предыдущих функций / команд.К тому времени, когда ваша асинхронная функция завершается и выдает ошибку, поток управления уже переместился впереди блока catch.

Следовательно, к тому времени, когда происходит отказ / обещание-отклонение, перехват не выполняется.блок, оставшийся в цикле обработки событий для его обработки.

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