Как бороться с логической ошибкой с помощью async?

#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;
  }
}