#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')
}
})()
Я надеюсь, что это вам поможет