0

私は間違いなくまっすぐに見えていないので、素早く手を探しています。私はグーグル・グーグルで、助けてくれたものはあまり見つからなかった。ノードjsの非同期スコープからの値を返す

は、シーンを設定します。

私は「googleapis」パッケージを使用するノードのアプリを持っています。今、私は正常に動作し、期待通りにデータを(ほとんど)返します。

問題は、各ビデオの再生時間を取得するために別々の呼び出しを行う必要があるときです(データのビットを別の呼び出しで取得する唯一の方法)。

期間の値をスコープの上に渡すことができないようです。私はそれを正しくやっていないと知っていると違うことをする必要があるが、私はここで木の木を見ることができません。

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

あなたが見ることができるように、私は何を達成しようとしていることは全く難しいことではありませんので、任意の助けいただければ幸いです。ありがとうございました。

+1

これは、ループ問題内側古典***非同期操作です*** 。最初の非同期操作が終了してコールバックを呼び出す前に、ループは完了まで実行され、すべてのタイミングを混乱させます。コードが機能しない理由を理解するためにいくつかの検索を行うことをお勧めします。残念ながら、私は、これらのタイプの質問すべての参照として使用できる良い標準的な答えはないと思います。 – jfriend00

+1

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

+0

まさにjfriend00のような気分でした。それはちょっと残念ですが、もう少し調べてみましょう – Roooss

答えて

0

私は以下のスタック質問の助けを借りて私の問題を解決することができました。 Calling an asynchronous function within a for loop in JavaScript

は基本的に私は匿名関数でそれを得るために少しをリファクタリングする必要がありましたが、それは御馳走を働いた....

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)); 
      } 
     } 
    }); 
関連する問題