0

我絕對沒有看到這個直線,所以我正在尋找一個快速的手。我一直在使用Google,並沒有發現有什麼幫助。從節點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)); 
      } 
     } 
    });