Javascript Node.js在for循环中写入文件
我正在node.js中使用Google Trends API来获得几个搜索词的流行度 我想在一个数组中写一些搜索词,然后访问这个数组,为每个元素调用GoogleTrendsAPI,并为每个元素创建一个包含API结果的文件 我试过这个: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 =
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]);
}