Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/45.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 使用异步函数返回的数据的正确方法(web抓取示例)_Javascript_Callback_Scope_Closures - Fatal编程技术网

Javascript 使用异步函数返回的数据的正确方法(web抓取示例)

Javascript 使用异步函数返回的数据的正确方法(web抓取示例),javascript,callback,scope,closures,Javascript,Callback,Scope,Closures,因此,我有这个简单的代码来挖掘一些视频url,以便在之后对其应用另一个刮取功能。我的问题是,我似乎无法返回url填充的数组。我知道这是一个范围问题,但我对Javascript不太熟悉,我的知识让我尽了最大的努力 代码如下: var request = require('request'); var cheerio = require('cheerio'); var startUrl = 'http://www.somewebsite.com/mostviewed'; var getVideo

因此,我有这个简单的代码来挖掘一些视频url,以便在之后对其应用另一个刮取功能。我的问题是,我似乎无法返回url填充的数组。我知道这是一个范围问题,但我对Javascript不太熟悉,我的知识让我尽了最大的努力

代码如下:

var request = require('request');
var cheerio = require('cheerio');

var startUrl = 'http://www.somewebsite.com/mostviewed';

var getVideoIds = function(url) {

    var urls = [];

    request(url, function(err, resp, body){
        if (err)
            throw err;
        $ = cheerio.load(body);


        var videoUrls = [];
        $('.videoTitle a').each(function() {
            videoUrls.push($(this).attr('href'));
        });
    });

   return urls;
}


var urlsToScrap = getVideoIds(startUrl);
console.log(urlsToScrap);

PS:当前代码返回一个空数组

您有两个问题。一是返回
url
,但它从未设置为任何内容。您正在将值推送到
videourl
上,但返回的是空的
url
数组。另一个是
request
是一个异步函数。您需要设置一个回调来设置视频URL,一旦它将抓取的数据带回来

因此:


这应该是可行的,而且是一种基本的方法。当然,您可以将这些内容包装到函数中,使其更易于重用,但我希望这能回答您的问题。

让我来看看!是的,确实如此,我正要发布几乎相同的答案!非常感谢。
var urls = [];

request(url, function(err, resp, body){
    if (err)
        throw err;
    $ = cheerio.load(body);

    $('.videoTitle a').each(function() {
        urls.push($(this).attr('href'));
    });

    onVideosScraped();
});

function onVideosScraped() {
    console.log(urls);  
}