#javascript #async-await
#javascript #async-ожидание
Вопрос:
Поскольку я использую async в своей работе. Я отправлю запрос ajax, а затем получу.
Я напишу так.
const API = {
init() {
this.initIndexData();
},
async initIndexData() {
try {
let data = await this.getData();
} catch (e) {
console.log(e);
}
},
getData() {
new Promise((resolve, reject) => {
$.ajax({
url: 'xx.json',
success(res) {
if (res.success) {
resolve(res);
} else {
reject(res);
}
}
})
});
}
}
API.init();
Поскольку мне не нравится код wirte с. try..catch
Есть ли какие-либо решения, с которыми можно справиться reject
без использования try catch
.
Я думаю, что я всегда могу использовать reolve
всякий раз, когда что происходит. Вот так.
if (res.success) {
resolve(res);
} else {
reject(res);
}
...
let data = await this.getData();
if (data.success) {
// do sth success logic
} else {
// do sth error logic
}
Выше приведено решение для решения reject
без try catch
, но этот код не является семантическим.
Комментарии:
1. » Мне не нравится код wirte с
try..catch
» — почему?2. @Bergi Я думаю, что когда я использую try .. catch, когда я не знаю, какая ошибка происходит. Но в примере, который я пишу, вы можете видеть, какая ошибка возникает, поэтому я думаю, что нет необходимости использовать try .. catch для устранения этой ошибки.
3. Ну, если вы хотите только уловить
!res.success
случай, то, может быть, вам просто следуетresolve
использоватьres
и поставить условие, при котором вы хотите с этим справиться. Ваше обещание также будет отклонено (иcatch
сработает) в случае неполадок в сети, синтаксической ошибки JSON или чего-то еще.
Ответ №1:
Вы можете использовать обычный .catch
метод обещаний:
async initIndexData() {
let data = await this.getData().catch(e => {
console.log(e);
});
},
async getData() {
const res = await $.ajax({
// ^^^^^ much better than `new Promise`
// as it does not ignore the ajax error handler
url: 'xx.json',
});
if (res.success) {
return res;
} else {
throw res;
}
}