0

Je ne vois certainement pas ce droit, donc je suis à la recherche d'une main rapide. J'ai été googler et pas trouvé beaucoup qui a aidé.renvoyer des valeurs à partir de la portée async dans le nœud js

Set la scène:

J'ai une application de nœud qui utilise le paquet 'googleapis'. Maintenant, cela fonctionne bien et renvoie des données (la plupart du temps) comme prévu.

Le problème survient lorsque je dois faire un appel séparé pour obtenir la durée de chaque vidéo (seul moyen d'obtenir ce bit de données avec un appel séparé).

Je ne semble pas être en mesure de transmettre la valeur de la durée à la portée. Je sais que je ne le fais pas bien et que je dois le faire différemment, mais je ne vois tout simplement pas le bois pour les arbres ici.

youtubeClient.search.list({ part: 'id,snippet', maxResults: 10, q: searchTerm, type: 'video' }, 
     function (err, data) { 
      if (err) { 
       console.error('Error: ' + err); 
      } 

      if (data) { 
       var returnList = []; 

       for (var item in data.items) { 

        var duration = '00:00'; // THIS IS THE VARIABLE I WANT POPULATED 
        var value = data.items[item].id.videoId; 

        youtubeClient.videos.list({ part: 'contentDetails', id: data.items[item].id.videoId }, 
         function (err, details) { 
          if (err) { 
           console.error('Error: ' + err); 
          } 

          if (details) { 
           // THIS IS WHERE I AM TRYING TO SET THE DURATION FIELD FROM THE RESULT 
           duration = details.items[0].contentDetails.duration; 
          } 
        }); 

        returnList.push({value: value, duration: duration}); 

       } 

       res.json(returnList); 
      } 
     }); 

Comme vous pouvez le voir, ce que je suis en train de réaliser ne devrait pas être du tout sorte que toute aide serait appréciée difficile. Je vous remercie.

+1

Ceci est une opération classique async *** dans un problème de boucle *** . La boucle s'exécute jusqu'à ce que la première opération asynchrone se termine et appelle son rappel, ce qui gâche le timing de tout. Suggérez-vous d'effectuer des recherches pour mieux comprendre pourquoi votre code ne fonctionne pas. Malheureusement, je ne pense pas qu'il existe une bonne réponse canonique qui puisse servir de référence pour tous ces types de questions. – jfriend00

+1

https://www.npmjs.com/package/async – afuous

+0

J'ai eu le sentiment que ce serait exactement le cas jfriend00. c'est dommage, je vais y regarder un peu plus – Roooss

Répondre

0

J'ai réussi à résoudre mon problème à l'aide de la question de pile suivante; Calling an asynchronous function within a for loop in JavaScript

En fait, je dû factoriser un peu pour obtenir dans la fonction anonyme, mais il a travaillé un régal ....

youtubeClient.search.list({ part: 'id,snippet', maxResults: 10, q: searchTerm, type: 'video' }, 
    function (err, data) { 
     if (err) { 
      console.error('Error: ' + err); 
     } 

     if (data) { 
      var returnList = []; 

      var total = data.items.length; 
      var count = 0; 

      for(var i = 0; i < total; i++){ 
       var returnItem = {}; 

       (function(foo){ 
        returnItem = { 
         duration: '00:00', 
         value: data.items[foo].id.videoId 
        }; 

        youtubeClient.videos.list({ part: 'contentDetails', id: returnItem.value }, 
         function (err, details) { 
          if (err) { 
           console.error('Error: ' + err); 
          } 

          if (details) { 
           returnItem.duration = details.items[0].contentDetails.duration; 

           returnList.push(returnItem); 
          } 

          count++; 
          if (count > total - 1) { 
           // I CAN EXIT FROM HERE NOW 
          } 
        }); 

       }(i)); 
      } 
     } 
    });