Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/427.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 承诺返回数据'&书信电报;待定>';_Javascript_Node.js_Asynchronous_Async Await - Fatal编程技术网

Javascript 承诺返回数据'&书信电报;待定>';

Javascript 承诺返回数据'&书信电报;待定>';,javascript,node.js,asynchronous,async-await,Javascript,Node.js,Asynchronous,Async Await,我从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

我从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)
        })
下面给出了5个相关视频的api

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> }
 }]
[{标题:
“Dil Zaffran视频歌曲| Rahat Fateh Ali Khan | Ravi Shankar | Kamal Chandra | Shivin | Palak”,
id:'vChX3XZXqN4',
视图:“28655496”,
相关视频:承诺{},
{标题:
“完整视频:Akh Lad Jaave | Loveyatri | Ayush S | Warina H | Badshah,Tanishk Bagchi,Jubin N,Asees K”,
id:'e_vl5aFXB4Q',
视图:“17334681”,
相关视频:承诺{}
}]

如何解决此
挂起
问题,或如何等待以获取完整数据。

当承诺尚未解决时,会发生这种情况,因此不会调用resolve函数。在没有以下条件的情况下测试这一点可能是个好主意

if(relatedVideos.length === 5){
    resolve(relatedVideos);
}

当承诺没有被解析,因此解析函数没有被调用时,就会发生这种情况。在没有以下条件的情况下测试这一点可能是个好主意

if(relatedVideos.length === 5){
    resolve(relatedVideos);
}

之所以会发生这种情况,是因为您将
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()
的目的。将上述代码更改为:

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

            return relatedVideos(el.id)
                .then(function(relatedVideo) {
                    o.relatedVideos = relatedVideo;
                    return o;
                });
        }));

请注意,映射到
Promise.ALL()
的所有承诺都需要解析,以便链继续执行下一个
然后
。如果哪怕是其中一个承诺被拒绝或根本没有解决,它将永远不会继续下去。在
relatedVideos()
函数中调用
resolve()
有一个条件。这意味着在某些情况下,承诺可能永远无法实现。您应该始终解析或拒绝承诺,也许
resolve(null)
适合您的情况。

之所以发生这种情况,是因为您将
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()
的目的。将上述代码更改为:

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

            return relatedVideos(el.id)
                .then(function(relatedVideo) {
                    o.relatedVideos = relatedVideo;
                    return o;
                });
        }));

请注意,映射到
Promise.ALL()
的所有承诺都需要解析,以便链继续执行下一个
然后
。如果哪怕是其中一个承诺被拒绝或根本没有解决,它将永远不会继续下去。在
relatedVideos()
函数中调用
resolve()
有一个条件。这意味着在某些情况下,承诺可能永远无法实现。您应该始终解决或拒绝承诺,也许
resolve(null)
适合您的情况。

我检查过这不是问题。我检查过这不是问题。我认为它应该可以工作,但不会达到下一个
。然后()
@Rupesh如果您完全按照我说的复制我的代码,它应该可以工作。您的
resolve()
调用您的
relatedVideos()
是有条件的,如果这些承诺中的任何一个没有解决,它将永远不会到达链中的下一个
然后
。确保他们都解决了,当你的条件不满足时,你真的需要按照承诺做些事情。thanx,它有效,在5个视频的条件下出现了问题。我认为它应该有效,但它不会到达下一个
。然后()
@Rupesh如果你完全按照我说的复制我的代码,它应该有效。您的
resolve()
调用您的
relatedVideos()
是有条件的,如果这些承诺中的任何一个没有解决,它将永远不会到达链中的下一个
然后
。确保他们都解决了,当你的条件不满足时,你真的需要对承诺做点什么。thanx,它起作用了,在5个视频的条件下出现了问题。