recherche

Maison  >  Questions et réponses  >  le corps du texte

l'attente asynchrone ne fonctionne pas dans la fonction composable vue 3

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粉752826008P粉752826008328 Il y a quelques jours581

répondre à tous(2)je répondrai

  • P粉071559609

    P粉0715596092024-03-26 15:31:51

    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

    répondre
    0
  • P粉764003519

    P粉7640035192024-03-26 09:19:39

    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
         }
       })
    }

    répondre
    0
  • Annulerrépondre