Axios асинхронный / ожидающий поток

#async-await #axios

#асинхронный-ожидающий #axios

Вопрос:

Я одновременно погружаюсь в воды Axios и async / await и пытаюсь что-то понять в потоке управления. Является ли следующее законным?

 let loading=true;
(async() => {
  let response = null;
  try {
    response = await axios.get('https://whatever.com/api');
  } finally {
    loading=false;
  }
  if(response){
    //do something with response here
  }
  
  
})();
  

То есть, могу ли я рассчитывать на возврат запроса в момент, когда я обращаюсь к переменной ответа? Я ценю, что мог бы гарантировать это, переместив его в «try» сразу после получения axios, но тогда мне нужно было бы иметь loading=false строку перед ним, а также в «finally» (или «catch»). Мне нужно убедиться, что для загрузки установлено значение false, прежде чем предпринимать какие-либо дальнейшие действия, независимо от того, выполняется ли запрос успешно или нет, и я не хочу повторяться. Может быть, есть лучший способ сделать это?

Ответ №1:

Редактировать

Теперь, когда вы изменили вопрос, предыдущее решение не будет работать корректно. Проблема в том, что код внутри IIFE будет выполнен после завершения всего остального, поэтому loading никогда не будет установлен false с точки зрения внешнего кода. (будет выполнен другой код, а затем IIFE. Это из-за цикла событий). Лучше всего сделать внешний код асинхронным и дождаться обещания axios.

Если вы предоставите подробную информацию о проблеме, я мог бы помочь вам ее реорганизовать.

Предыдущий ответ

Мне нужно убедиться, что для загрузки установлено значение false перед любыми дальнейшими действиями

Любой код после ожидания гарантированно НЕ загружается:

 (async() => {
  let response = await axios.get('https://whatever.com/api');  
  // the request is finished, the await guarantees that
})();
  

Если вам нужна обработка ошибок, вы можете обернуть ее в try / catch:

 (async() => {
  try {
     let response = await axios.get('https://whatever.com/api');
     // definitely not loading
  }
  catch (e) {
     // definitely not loading, but an error occurred
  }
})();
  

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

1. Извините, не совсем понятно, что это значит. Вы хотите сказать, что мой код будет работать правильно? (Вы заметите, что я использую структуру try / finally, но не использую catch, потому что просмотр переменной ответа покажет, произошла ошибка или нет (т. Е. Если Она по-прежнему равна нулю или нет).).

2. Ваш код будет работать правильно, я просто убрал сложность. Первый предоставленный мной фрагмент будет вести себя точно так же, как ваш код, просто все ненужные переменные и ifs будут удалены.

3. Итак, куда мне положить loading=false ? Это моя точка зрения. Похоже, что, судя по тому, как у вас это есть, мне нужно было бы иметь это как после let response = await... , так и в блоке catch.

4. Вам не нужна эта переменная, потому что она локальная — она не избежит IIFE. Код после строки с await in в нем никогда не может быть loading=true . Вот почему я его удалил. Именно так ведет себя async-await.

5. Ах, хорошо, я понимаю, что вы имеете в виду. Плохо написанный пример с моей стороны. Переменная ‘loading’ должна была быть определена до (вне) IIFE. Мне нужно установить для загрузки значение false перед любыми дальнейшими действиями, независимо от того, успешно ли завершен запрос. Меня просто беспокоит, как избежать повторения ‘loading = false’ в обоих путях выполнения. Ничего страшного, просто кажется немного грязным.