Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.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 Node.js在for循环中写入文件_Javascript_Node.js - Fatal编程技术网

Javascript Node.js在for循环中写入文件

Javascript Node.js在for循环中写入文件,javascript,node.js,Javascript,Node.js,我正在node.js中使用Google Trends API来获得几个搜索词的流行度 我想在一个数组中写一些搜索词,然后访问这个数组,为每个元素调用GoogleTrendsAPI,并为每个元素创建一个包含API结果的文件 我试过这个: const googleTrendsApi = require("google-trends-api"); const fs = require('fs'); var cars = ["Saab", "Volvo", "BMW"]; for(var j =

我正在node.js中使用Google Trends API来获得几个搜索词的流行度

我想在一个数组中写一些搜索词,然后访问这个数组,为每个元素调用GoogleTrendsAPI,并为每个元素创建一个包含API结果的文件

我试过这个:

const googleTrendsApi = require("google-trends-api");
const fs = require('fs');

var cars = ["Saab", "Volvo", "BMW"]; 

for(var j = 0; j < 3; j++)
{
    googleTrendsApi.interestOverTime({keyword: cars[j]})
        .then(function(results){
            fs.writeFile(cars[j]+'.txt', results, function (err) {
                if (err) return console.log(err);
            })
        })
        .catch(function(err){
            console.error(err);
        });
    console.log(cars[j]);
};
const googleTrendsApi=require(“谷歌趋势api”);
常数fs=要求('fs');
var汽车=[“萨博”、“沃尔沃”、“宝马”];
对于(var j=0;j<3;j++)
{
googleTrendsApi.interestOverTime({关键字:汽车[j]})
.然后(函数(结果){
fs.writeFile(cars[j]+'.txt',结果,函数(err){
if(err)返回console.log(err);
})
})
.catch(函数(err){
控制台错误(err);
});
控制台日志(cars[j]);
};

问题是这个方法不起作用(它不创建文件),我不知道为什么。如何在for循环中创建多个文件并在每个文件中写入单独的数据?

在for循环中运行异步方法时,必须考虑到一旦异步方法返回,索引可能(也可能)更改为最后一个索引(j=3)。 这是因为异步方法在所有索引中的执行时间可能比for循环要长得多

您可以通过运行以下命令自己进行验证:

for (var i = 0; i < 3; i++) {
    setTimeout(function () {
        console.log(i);
    }, 1000);
}
然后for循环将调用execute(j):

for(var j=0;j<3;j++)
{
执行(j);
控制台日志(cars[j]);
}

execute(j)将确保捕获j的上下文,即使在异步方法执行之前。

删除
返回控制台.log(err)
中的
返回。是否在fs回调或google trend promise拒绝中向控制台打印时出错?@noahnu that return不做任何事情。它是不创建文件,还是只创建一个文件。当然,它在做一些事情,要么创建文件,要么抛出错误。@KevinB我知道,这就是为什么我说要删除它。它是多余的。更简单的方法是将
var
更改为
let
@noahnu您是对的,但我认为只有ES6才支持“let”,ES6是第一个支持闭包(“()=>”而不是op没有使用的“function()”)的版本。假设ES6在节点上可用是非常安全的。Op甚至使用了
const
。无论如何,如果Op的代码根本没有创建任何文件,那么这并不是问题的根源。如果这是一个问题,我们有一个非常好的规范文章来欺骗它关闭。
function execute(j) {
        googleTrendsApi.interestOverTime({keyword: cars[j]})
        .then(function(results){
            fs.writeFile(cars[j]+'.txt', results, function (err) {
                if (err) return console.log(err);
            })
        })
        .catch(function(err){
            console.error(err);
        });
}
for(var j = 0; j < 3; j++)
{
    execute(j);
    console.log(cars[j]);
}