IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

NodeJS Discussion :

Utiliser async/await sur une Promise (winsc)


Sujet :

NodeJS

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 42
    Points : 34
    Points
    34
    Par défaut Utiliser async/await sur une Promise (winsc)
    Bonjour,

    J'essaie d'utiliser winsc dans une application NodeJS afin de manipuler des services https://www.npmjs.com/package/winsc.
    Lorsque j'utilise les fonctions avec des .then() cela fonctionne bien.
    Mais j'aimerais transformer le code pour utiliser des async/await. Sauf que je n'y arrive pas

    Voici mon code de test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    const winsc = require('winsc');
     
    async function serviceStatus(serviceName) {
        return await winsc.status(serviceName);
    }
     
    let status = serviceStatus('TeamViewer');
    console.log(status);
    J'ai comme résultat
    Alors que là j'ai la bonne valeur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    const winsc = require('winsc');
     
    async function serviceStatus(serviceName) {
        console.log(await winsc.status(serviceName));
    }
     
    serviceStatus('TeamViewer');
    Résultat

    Qu'est-ce que je ne comprends pas ? Vous pouvez m'aider ?

    Merci

  2. #2
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2018
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2018
    Messages : 119
    Points : 168
    Points
    168
    Par défaut
    Bonjour,

    On dirait que les methods de 'winsc' retournent des promises (d'ou le message, promise pending), donc il faut que tu la consumes (je ne sais pas si le terme est bon, mais j'ai rien d'autre qui me vient).

    Ceci devrait resoudre le probleme.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    async function serviceStatus(serviceName) {
        return await winsc.status(serviceName);
    }
     
    let status = serviceStatus('TeamViewer');
    status.then(d => console.log('promise resolve: ', d)).catch(e => console.error(e))
    Si tu veux directement beneficier du async/await, fais comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    async function serviceStatus(serviceName) {
        try{
        const status = await winsc.status(serviceName);
       // developpes la logique utilisant status 
       console.log(status) 
     
     
       } catch(e) {
          console.log('handle the err: ', e) 
       }
    }
     
    serviceStatus('TeamViewer')
     
    // !!! le code ici sera execute avant serviceStatus()
    // pour y pallier il faudrait wrapper dans une autre async function et await serviceStatus('TeamViewer')
    // donc l'idee est de placer tout le code dans serviceStatus() puis declancher la function a la fin.

  3. #3
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    La seule chose que je veux ajouter, c'est que l'usage du mot clé await dans la ligne return a un sens douteux et innécessaire: le mot async devant function serve déjà à wrapper le retourne dedans une promesse implicitement ici (ou explicitement pour l'autre écriture). Je pense il serait déjà clair et suffisant de l'écrire simplement comme :
    Code js : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    async function serviceStatus(serviceName) {
        //return await winsc.status(serviceName);
        return winsc.status(serviceName);
    }

  4. #4
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2018
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2018
    Messages : 119
    Points : 168
    Points
    168
    Par défaut
    Tout a fait. Pour aller plus loin, même le 'async' ne sert a rien.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function serviceStatus(serviceName) {
        return winsc.status(serviceName);
    }
    serviceStatus(serviceName).then(d => console.log(d)).catch(e => console.log(e))
     
    // encore plus simple
    winsc.status(serviceName).then(d => console.log(d)).catch(e => console.log(e))

    Async autorise seulement l'utilisation de await, ce qui permet d’écrire le code comme si il était synchrone (alors qu il fonctionne de manière asynchrone). Ce n'est que du sucre syntaxique.
    Async/await est donc utile uniquement si la logique est développée a l’intérieure d'une fonction async func()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    async function serviceStatus(serviceName) {
        try{
        const status = await winsc.status(serviceName);
       // developpes la logique utilisant status 
       console.log(status) 
     
     
       } catch(e) {
          console.log('handle the err: ', e) 
       }
    }
     
    serviceStatus('TeamViewer')
     
    // !!! le code ici sera execute avant serviceStatus()
    // pour y pallier il faudrait wrapper dans une autre async function et await serviceStatus('TeamViewer')
    // donc l'idee est de placer tout le code dans serviceStatus() puis declancher la function a la fin.

  5. #5
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    @djedjethai
    Pour aller plus loin, même le 'async' ne sert a rien.
    Très bien, mais pour aller là, la fonction reste valide pour le code qui suit sous une condition incontournable: le retourne doit être implicitement ou explicitement une promesse. Dans ce cas-ci, cette condition est respectée: si on regarde le code de source, la méthode status retourne une promesse explicitement, donc, au point de vue de serviceStatus() implicitement. C'est la seule point qu'il faut faire attention pour 'aller plus loin'.

  6. #6
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2018
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2018
    Messages : 119
    Points : 168
    Points
    168
    Par défaut
    @Tsuji,

    Oui tout a fait. Si c'est une Call-Back il faut la Promisifier dans un premier temps pour ensuite pouvoir la consumer(j 'ai verifier le terme) avec .then().catch() ou encore en utilisant async/await, comme expose dans les precedants messages.

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 42
    Points : 34
    Points
    34
    Par défaut
    Merci à tous pour vos réponses.
    Comme vous le disiez j'ai résolu ce problème en appelant ces fonctions dans une Promesse avec .then()

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Utilisation de checkbox sur une image noir
    Par Coussati dans le forum Débuter
    Réponses: 12
    Dernier message: 18/11/2008, 03h14
  2. [awk] Utiliser plusieurs FS sur une même ligne
    Par novices dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 06/08/2008, 18h45
  3. Réponses: 11
    Dernier message: 24/03/2007, 16h01
  4. Utilisation des Frames sur une Forms
    Par selmak7 dans le forum C++Builder
    Réponses: 5
    Dernier message: 20/07/2006, 17h42
  5. [TChart] Comment utiliser le curseur sur une courbe ?
    Par marsupilami34 dans le forum Composants VCL
    Réponses: 4
    Dernier message: 29/09/2005, 16h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo