l'attente asynchrone ne fonctionne pas dans la fonction composable vue 3
P粉752826008
P粉752826008 2024-03-25 20:48:21
0
2
548

Dans mon projet, j'ai une fonction pour télécharger des fichiers. Lorsque le bouton sera cliqué, la fonction onDownload sera appelée :

import {useOnDownload} from "../../use/useOnDownload"

setup() {

    ...

    const loading = ref(null)
    onDownload = (id) => {
        loading.value = id
        await useOnDownload(id)
        loading.value = null
    }
    
    return {loading, onDownload}
}

J'ai refactorisé le code API dans le fichier d'appel useOnDownload.js car d'autres composants utilisent également le même code.

export async function useOnDownload(id) {
    // make api call to server with axios
}

Qu'est-ce que j'ai fait de mal ? Je dois attendre la fonction useOnDownload ... pour que le chargeur fonctionne correctement.

P粉752826008
P粉752826008

répondre à tous(2)
P粉071559609

Voici comment créer une fonction composable asynchrone à l'aide de la syntaxe d'attente asynchrone

export default function useOnDownload() {
  const isLoading = ref(true);

  const onDownload = async () => {
    isLoading.value = true;
    try {
      const { data } = await axios.post('/api/download', {id: id}, 
     {responseType: 'blob'})
        // handle the response

    } catch (error) {
      console.log(error);
    } finally {
      isLoading.value = false;
    }
  };
   // invoke the function
  onDownload();

  return { // return your reactive data here };
}


import useOnDownload from "../../use/useOnDownload"
// no await in setup script or function 
const { reactiveDataReturned } = useOnDownload();

Cliquez icipour plus d'informations

P粉764003519

J'ai réussi à résoudre une autre méthode sans async et attendre...

Je passe le chargeur d'objet de référence à l'argument de la fonction (en option) et je le gère à partir de là...

export function useOnDownload(id, loader) {
   if(loader !== undefined) {
     loader.value = id
   }
   axios.post('/api/download', {id: id}, {
      responseType: 'blob'
   }).then(response => {
     // handle the response
     ...
     if(loader !== undefined) {
       loader.value = null
     }
   }).catch(error => {
     // handle the error
     ...
     if(loader !== undefined) {
       loader.value = null
     }
   })
}
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal