Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/402.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 访问请求cheerio功能外的变量_Javascript_Callback_Cheerio - Fatal编程技术网

Javascript 访问请求cheerio功能外的变量

Javascript 访问请求cheerio功能外的变量,javascript,callback,cheerio,Javascript,Callback,Cheerio,在cheerio库的请求函数之外访问变量时,我面临一个问题 以下是我的简化代码,以便更好地理解: var fullDragonInfo = {}; dragonsInfo.forEach(dragon => { request(`url=${dragon.name}`, function (error, response, html) { if (!error && response.statusCode == 200) {

在cheerio库的请求函数之外访问变量时,我面临一个问题

以下是我的简化代码,以便更好地理解:

var fullDragonInfo = {};

dragonsInfo.forEach(dragon => {

    request(`url=${dragon.name}`, function (error, response, html) {
        if (!error && response.statusCode == 200) {

            var $ = cheerio.load(html);

            $('tr').each(function (i) {
                let childrenElement = $(this).children('td').children('font');

                breedingList.push({
                    'parent_1': {
                        'name': childrenElement.eq(0).text(),
                        'color': childrenElement.eq(0).attr('color')
                    },
                    'parent_2': {
                        'name': childrenElement.eq(1).text(),
                        'color': childrenElement.eq(1).attr('color')
                    },
                    'Tokens': childrenElement.last().text()
                });

            });

            Object.assign(fullDragonInfo, {
                [dragon.name]: {
                    'type': dragon.type,
                    'tier': dragon.tier,
                    'class': dragon.class,
                    'breedable_level': dragon.breedable_level,
                    'breeds_combination': breedingList
                }
            });
        }
    });
});

fs.writeFile("finalData.json", JSON.stringify(fullDragonInfo));
因此,我的输出文件finalData.json显示了一个空对象。但是如果我在回调函数中做一个控制台日志,数据就在这里


因此,我假设问题是我无法在回调之外访问变量,但我不知道如何才能访问变量。

由于请求是异步发生的,但您是同步写入文件的,因此在您的任何请求返回之前写入。在写入文件之前,需要等待请求完成

如果你能用承诺,那可能会更好。但仅计算您的请求就可以减少对代码的修改,就像现在这样:

var fullDragonInfo = {};
var callbackCount = 0;

dragonsInfo.forEach(dragon => {

    callbackCount++;

    request(`url=${dragon.name}`, function (error, response, html) {

        callbackCount--;

        if (!error && response.statusCode == 200) {

            var $ = cheerio.load(html);

            $('tr').each(function (i) {
                let childrenElement = $(this).children('td').children('font');

                breedingList.push({
                    'parent_1': {
                        'name': childrenElement.eq(0).text(),
                        'color': childrenElement.eq(0).attr('color')
                    },
                    'parent_2': {
                        'name': childrenElement.eq(1).text(),
                        'color': childrenElement.eq(1).attr('color')
                    },
                    'Tokens': childrenElement.last().text()
                });

            });

            Object.assign(fullDragonInfo, {
                [dragon.name]: {
                    'type': dragon.type,
                    'tier': dragon.tier,
                    'class': dragon.class,
                    'breedable_level': dragon.breedable_level,
                    'breeds_combination': breedingList
                }
            });
        }

        if (callbackCount === 0) {
            fs.writeFile("finalData.json", JSON.stringify(fullDragonInfo));
        }
    });
});
通过计算您发出的每个请求,然后在每次收到响应时删除一个计数,您将知道如果计数再次为零,则所有请求都必须已完成。因此,在每个请求结束时,我们检查它是否是最后一个完成的请求,如果是,将数据写入文件是安全的