Как поймать ошибку в функции обратного вызова JS?

#javascript #asynchronous #error-handling #async-await #callback

Вопрос:

Я хочу поймать ошибку в функции обратного вызова.

 (async function(){
    function wait(ms){
        return new Promise(function(resolve, reject){
            setTimeout(resolve, ms);
        });
    }

    async function test(){
        while(true) {
            if (window.err){
                throw 'This is an error!';
            }
            await wait(500);
        }
    }

    
    try {
        console.log('running ...');

        window.err = false;
        setTimeout(function(){
            window.err = true;
        }, 1000);

        test();
    
        await wait(3000);
        console.log('end')
        console.log('done')
    }
    catch(err){
        // How do i catch error of "test" function in this
        console.log('end')
        console.log('error')
    }
})()
 

…………………………………………………………………………………………………………………………………………………………………………….
Как мне поймать ошибку тестовой функции в этом?
Мой англист не очень хорош, помогите мне, пожалуйста! Спасибо!

Ответ №1:

test это асинхронная функция, если вы вызовете ее, не дожидаясь ее, ошибки будут проигнорированы.

Вместо test() использования await test() .

Или, если вы не хотите ждать его и просто получать уведомления о возникновении ошибки, вы можете использовать Promise.catch :

 test().catch(err => {
  // Handle the error in some way
  console.error(err)
}) 
 

Комментарии:

1. Я знаю это, но я хочу запустить такую функцию, как (многопоточность). Он проверяет состояние каждый раз!

2. @nguyenphuong это невозможно. JS однопоточный. Если только вы не используете веб-работников.

3. @nguyenphuong Можете ли вы сообщить более подробную информацию. Чего вы пытаетесь достичь? Возможно, я смогу показать вам генераторы.

Ответ №2:

если вы хотите поймать ошибку с помощью тестовой функции, вы можете попробовать сделать следующее

 (async function(){
    function wait(ms){
        return new Promise(function(resolve, reject){
            setTimeout(resolve, ms);
        });
    }

    async function test(){
      return new Promise((resolve, reject)  => {
       try {
          while(true) {
            if (window.err){
                throw 'This is an error!';
            }
            await wait(500);
            resolve();
          }
       } catch(err) {
             reject(err) // here we are catching the error and throw it back to the caller 
       }
      });
    }

    
    try {
        console.log('running ...');

        window.err = false;
        setTimeout(function(){
            window.err = true;
        }, 1000);

       try {
         await test();
       } catch (err) {
         console.log(err) // here we get the error from the test
       }

    
        await wait(3000);
        console.log('end')
        console.log('done')
    }
    catch(err){
        // How do i catch error of "test" function in this
        console.log('end')
        console.log('error')
    }
})()

 

Я надеюсь, что это вам поможет