2015-12-21 2 views
1

В моем настраиваемом модуле для работы с данными я отправляю 2 запроса для первого получения списка видеороликов из своего плейлиста, а во-вторых, я посылаю другой запрос, используя videoID, который я получил от первого результата.API-интерфейс Youtube с использованием async в node.js Express для нескольких зависимых запросов

Поскольку второй запрос зависит от первого, я использую метод асинхронного модуля waterfall.

Чтобы проверить, что это работает правильно, я регистрирую результат 1-го запроса во второй функции, но веб-страница не работает и ничего не возвращает в консоли.

Есть проблемы?

var data = function(callback) { 

    var request = require('request'), 
     async = require('async'); 

    async.waterfall([ 

     function getVideo (getVideoCallback) { 
      var url = "https://www.googleapis.com/youtube/v3/playlistItems"; 

      var properties = { 
       part: 'snippet, contentDetails', 
       playlistId: 'xxx', 
       key: 'xxx', 
       maxResults: 50 
      } 

      request({ url:url, qs:properties}, function(err, response, body) { 
       if(err) { console.log(err); return; } 
       body = JSON.parse(body); 

       getVideo(body, getVideoCallback); 
      }); 

     }, 

     function getVideoDetails (result, getVideoDetailsCallback) { 

      console.log(result); 

      ... 

     } 
    ], function (err, result) { 

     if (err) { console.log(err); return; } 

     callback(result); 

    }); 
} 

module.exports = data; 

ответ

1

В вашей первой функции водопада

 request({ url:url, qs:properties}, function(err, response, body) { 
      if(err) { console.log(err); return; } 
      body = JSON.parse(body); 

      getVideo(body, getVideoCallback); 
     }); 

Вы называете первую функцию водопад снова вместо того, чтобы вызвать функцию обратного вызова, рекурсивный вызов с неправильными аргументами. Для того, чтобы прогрессировать к следующей функции в стеке водопада, вам необходимо вызвать функцию обратного вызова следующим образом:

 request({ url:url, qs:properties}, function(err, response, body) { 
      if(err) { console.log(err); return; } 
      body = JSON.parse(body); 

      getVideoCallback(null, body); 
     }); 

заказ async.js пример водопада:

waterfall example

+0

Я сделал, как вы предложил, и сейчас все идет хорошо. Благодарю. –