Как я могу дождаться асинхронного вызова, прежде чем манипулировать результатами, используя axios с реактивным URL-адресом — Vue.js 3 .

#vue.js #axios #vuejs3 #vue-composition-api

#vue.js #axios #vuejs3 #vue-composition-api

Вопрос:

У меня есть следующий код, который извлекает данные. URL-адреса должны быть реактивными, если это изменение, выполняется новый вызов.:

 const apiClient = axios.create({
  baseURL: 'https://vue-http-demo-some-number.firebaseio.com',
  withCredentials: false,
  headers: {
    Accept: 'application/json',
    'Content-Type': 'application-json'
  }
});

function useFetch(getRelativeURL) {
  const data = ref(null);
  const error = ref(null);
  const isPending = ref(true);

  watchEffect(() => {
    apiClient.get(getRelativeURL())
      .then(response => {
        data.value = response.data;
      })
      .catch(err => {
        error.value = err;
      })
      .finally(() => {
        isPending.value = false;
      });
  });
  return {
    data,
    error,
    isPending
  }
}
  

и вызов:

 setup() {

  const books = [];
  const {data, error, isPending} = useFetch(() => '/books.json');

  for (const key in data.value) {
    for (const u in data.value[key]) {
      const book = {
        id: key,
        title: data.value[key][u].title,
        description: data.value[key][u].description,
      };
      books.push(book);
    }
  }

  return {
    books,
    error,
    isPending
  }
}
  

Моя проблема в том, что ответ от userFecth приходит с задержкой, и книги извлекаются до того, как у меня появятся ненулевые данные. Какие варианты у меня есть, чтобы сохранить реактивность url и обновить книги.

Ответ №1:

Вы могли бы наблюдать data за тем, что происходит из функции композиции :

 
import {watch} from 'vue'
setup() {

  const books = [];
  const {data, error, isPending} = useFetch(() => '/books.json');

 watch(()=>data,()=>{
   for (const key in data.value) {
     for (const u in data.value[key]) {
       const book = {
        id: key,
        title: data.value[key][u].title,
        description: data.value[key][u].description,
       };
       books.push(book);
     }
    }
  }
 ,{
 deep:true
 })

  return {
    books,
    error,
    isPending
  }
}