Обещает возвращенные данные "<pending>" - PullRequest
0 голосов
/ 23 ноября 2018

мои данные, полученные с YouTube, используют nodejs: -

    [ { title:
         'Dil  Zaffran Video Song | Rahat Fateh Ali Khan |  Ravi Shankar |  Kamal Chandra | Shivin | Palak',
        id: 'vChX3XZXqN4',
        view: '28652353' },
      { title:
         'Full Video: Akh Lad Jaave | Loveyatri | Aayush S|Warina H |Badshah, Tanishk Bagchi,Jubin N, ,Asees K',
        id: 'e_vl5aFXB4Q',
        view: '17328447' 
}]

Теперь я хочу найти 5 похожих видео для каждого видео

мои API

getVids(videosID)
        .then(result => {
            console.log(result)  //this is the data which I showed above
            result.sort((a,b) => b.view - a.view);
            return result;
        })
        .then(result => {

            return result.map(function(el) {
                // console.log(el);
                let o = Object.assign({}, el);

                o.relatedVideos = relatedVideos(el.id); //function is called below
                return o;
            });
        })
        .then(result => {
            console.log(result);
        })
        .catch(err => {
            console.log(err)
        })

и api к 5 связанным видео даны ниже

function relatedVideos(videoId) {

    return new Promise((resolve, reject) => {
        let urls = 'https://www.googleapis.com/youtube/v3/search?relatedToVideoId=' + videoId + '&key=' + API_KEY + '&part=snippet&type=video';
        request(urls, (err, result) => {
            const data = JSON.parse(result.body);
            const relatedVideos = [];
            data.items.forEach(related => {
                relatedVideos.push({
                    title: related.snippet.title
                });
                if(relatedVideos.length === 5){
                    resolve(relatedVideos);
                }
            });
        });
    });
}

Это дает вывод как

    [ { title:
         'Dil  Zaffran Video Song | Rahat Fateh Ali Khan |  Ravi Shankar |  Kamal Chandra | Shivin | Palak',
        id: 'vChX3XZXqN4',
        view: '28655496',
        relatedVideos: Promise { <pending> } },
      { title:
         'Full Video: Akh Lad Jaave | Loveyatri | Aayush S|Warina H |Badshah, Tanishk Bagchi,Jubin N, ,Asees K',
        id: 'e_vl5aFXB4Q',
        view: '17334681',
        relatedVideos: Promise { <pending> }
 }]

Как решить эту проблему pending или как ждать, чтобы она получалаполные данные.

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Это происходит потому, что вы присваиваете обещание, возвращаемое relatedVideos() свойству relatedVideos, вы фактически никогда не ждете его разрешения.Вам нужно дождаться всех обещаний, прежде чем продолжить, это проще всего сделать с помощью Promise.all().Давайте сосредоточимся на этой части вашего кода:

        return result.map(function(el) {
            // console.log(el);
            let o = Object.assign({}, el);

            o.relatedVideos = relatedVideos(el.id); //function is called below
            return o;
        });

Что вам нужно сделать, это дождаться разрешения каждого обещания, чтобы получить его разрешенное значение, прежде чем назначить его объекту.Затем вам также нужно создать обещание, которое не будет выполнено, пока все эти обещания не будут выполнены.Вот для чего Promise.all().Измените код, указанный выше:Если хотя бы одно из этих обещаний отвергается или не решается вообще, оно никогда не будет продолжено.У вас есть условие для вашего вызова resolve() в функции relatedVideos().Это подразумевает, что в некоторых случаях обещание может никогда не исполниться.Вы должны всегда выполнять или отклонять обещание, возможно, resolve(null) будет уместным в вашем случае.

0 голосов
/ 23 ноября 2018

Это происходит, когда обещание не было разрешено, поэтому ваша функция разрешения не вызывается.Вероятно, было бы неплохо проверить это без условного выражения ниже.

if(relatedVideos.length === 5){
    resolve(relatedVideos);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...