Не удалось разрешить обещание и обновить данные в приложении Node.js - PullRequest
0 голосов
/ 06 октября 2018

Привет У меня есть маршрутизатор, определенный в Node.js, который основан на экспрессе, использующем асинхронный вызов:

const service = new YoutubeService();
router.get('/', async function(req, res) {
  const trends = await service.getTrendingVideos();
  console.log(trends);
  res.render('youtube/index', {
    title: config.title,
    videos: trends
  });
});

Мой служебный файл выглядит так:

export class YoutubeService {
  getTrendingVideos() {
    var params = {
      part: 'snippet',
      chart: 'mostPopular',
      regionCode: 'US', // should be replaced with country code from countryList
      maxResults: '24',
      key: config.youtubeApi.key
    };

    var result = [];

    return axios.get('/', {params}).then(function(res){
      result = res.data.items;
      for (var i = 0; i < result.length; i++) {
        result[i] = {
          id: result[i].id,
          title: result[i].snippet.title,
          thumbnail: result[i].snippet.thumbnails.high.url,
          publishedAt: moment(result[i].snippet.publishedAt).fromNow()
        };
        result[i] = YoutubeService.getVideoDetails(result[i]);
      }
      return result;
    });
  }

  static getVideoDetails(video) {
    var params = {
      part: 'statistics',
      id: video.id,
      key: config.youtubeApi.key
    };

    return axios.get('/', {params}).then(function(res) {
      var result = res.data;

      video.viewCount = result['items'][0].statistics.viewCount;
      video.likeCount = result['items'][0].statistics.likeCount;
      return video;
    });
  }
}

Проблемаэто то, что сначала, когда я работаю с консолью по трендам, она всегда печатает <promise> ..., как это, и не обновляет данные, а просто показывает пустые записи в html.

Когда я делаю console.log внутри метода get axios, он печатаетданные.Означает, что данные поступают, но не обновляются до моей асинхронной функции.

Любая помощь будет признательна?

1 Ответ

0 голосов
/ 07 октября 2018

Похоже, вы просто добавляете обещания в массив и просто возвращаете этот массив, поэтому вы получаете такой вывод console.log, какой вы есть в настоящее время.Сначала вы не разрешаете каждое обещание внутри цикла, а просто возвращаете дескриптор для каждого неразрешенного обещания.Вам нужно либо await внутри каждой итерации цикла (плохая практика ...), либо разрешить свой массив обещаний с помощью Promise.all

Попробуйте разрешить все свои результаты с помощью Promise.all

return axios.get('/', {params}).then(function(res){
  result = res.data.items;
  for (var i = 0; i < result.length; i++) {
    result[i] = {
      id: result[i].id,
      title: result[i].snippet.title,
      thumbnail: result[i].snippet.thumbnails.high.url,
      publishedAt: moment(result[i].snippet.publishedAt).fromNow()
    };
    result[i] = YoutubeService.getVideoDetails(result[i]);
  }
  return Promise.all(result); // <--- wrap this in a Promise.all.  It will resolve all promises in your array, concurrently.
});
...