【问题标题】:node.js Get.Request & Pagination & Asyncnode.js Get.Request & 分页 & 异步
【发布时间】:2018-08-13 12:13:18
【问题描述】:

我在这里组织流程非常困难,因为我是自学成才的,所以想知道是否有人可以提供帮助。

var channelIds = ['XYZ','ABC','QRS']
var playlistIds = [];
var videoIds = [];

流程顺序

1.获取所有播放列表 ID: 如果返回的 Get Request JSON 包含 nextPageToken,则在转到 (2) 之前再次使用该页面运行 Get Request

2。获取所有视频 ID: 如果返回的 Get Request JSON 包含 nextPageToken,则在转到 (3) 之前再次使用该页面运行 Get Request

3.聚合到最终数组中: 我需要将所有内容放入一个数组中,例如: var ArrFinal = [{channelId,playlistID,videoId},{channelId,playlistID,videoId},{channelId,playlistID,videoId}];

我不一定需要有人来写整件事。我试图更好地了解了解上一步何时完成的最有效方法,同时还要处理 nextPageToken 迭代。

【问题讨论】:

    标签: node.js youtube-data-api


    【解决方案1】:

    我不熟悉 youtube api。 但是您基本上需要的是每个端点的 get 函数。这个函数也应该关心“nextPageToken”。

    类似的东西:(未测试)

    'use strict';
    
    const Promise = require('bluebird');
    const request = Promise.promisifyAll(require('request'));
    
    const playlistEndpoint = '/youtube/v3/playlists';
    const baseUrl = 'https://www.googleapis.com'
    
    const channelIds = ['xy', 'ab', 'cd'];
    
    const getPlaylist = async (channelId, pageToken, playlists) => {
    
      const url = `${baseUrl}${playlistEndpoint}`;
      const qs = { 
        channelId,
        maxResults: 25,
        pageToken
      };
    
      try {
        const playlistRequest = await request.getAsync({ url, qs });
        const nextPageToken = playlistRequest.body.nextPageToken;
        // if we already had items, combine with the new ones
        const items = playlists ? playlists.concat(playlistRequest.body.items) : playlistRequest.body.items;
        if (nextPageToken) {
          // if token, do the same again and pass results to function
          return getPlaylist(channelId, nextPageToken, items);
        }
        // if no token we are finished 
        return items;
      }
      catch (e) {
        console.log(e.message);
      }
    };
    
    const getVideos = async (playlistId, pageToken, videos) => {
    
      // pretty much the same as above
    }
    
    function awesome(channelIds) {
    
      const fancyArray = [];
    
      await Promise.map(channelIds, async (channelId) => {
    
        const playlists = await getPlaylist(channelId);
    
        const videos = await Promise.map(playlists, async (playlistId) => {
    
          const videos = await getVideos(playlistId);
    
          videos.forEach(videoId => {
            fancyArray.push({ channelId, playlistId, videoId })
          })
        });
      });
    
      return fancyArray;
    }
    
    awesome(channelIds)
    

    // 更新

    这可能是很多并发请求,您可以通过使用限制它们

    Promise.map(items, item => { somefunction() }, { concurrency: 5 });
    

    【讨论】:

    • 很抱歉,因为我是一个初学者,并且遵循大多数但不是全部。你知道我为什么会收到:我的 async(? const getPlaylist = async(channelId, pageToken, playlists) => { SyntaxError: Unexpected token (
    • 您使用的是哪个节点版本?也许那里没有异步等待
    • 如果您使用的是 Node return somepromise.then(result => { console.log(result) }
    • 我更新到 v8,但我认为问题可能是“promisify 不再将多参数回调转换为数组的 Promise”。我只是不知道如何解决它
    • 你不需要承诺任何事情,但在我看来,它让生活变得更轻松。如果您决定使用它,请阅读此处bluebirdjs.com/docs/api/promise.promisify.html。你可以试试const request = Promise.promisifyAll(require('request'), { multiArgs: true });
    猜你喜欢
    • 2011-10-26
    • 1970-01-01
    • 2013-05-11
    • 2015-02-23
    • 2011-07-05
    • 2021-09-03
    • 2016-10-11
    • 2015-12-22
    • 1970-01-01
    相关资源
    最近更新 更多