我在node.js中使用Google趋势API来获得多个搜索字词的受欢迎程度。
我想在数组中编写一些搜索词,然后访问此数组,为每个元素调用Google Trends API,并为每个元素创建一个包含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]);
};
问题是这种方法不起作用(它没有创建文件),我也不知道为什么。如何在for循环中创建多个文件并在每个文件中写入单独的数据?
答案 0 :(得分:1)
在for循环中运行异步方法时,必须考虑到异步方法返回后索引可能(并且可能会)更改为最后一个索引(j = 3)。 这是因为async方法执行的时间可能比for循环遍历所有索引要长得多。
您可以运行以下方式自行验证:
new_words {'here': 1, 'see': 2, 'sun': 1, 'and':1}
输出为:3 3 3
为了克服它,你将for循环的主体放在方法
中for (var i = 0; i < 3; i++) {
setTimeout(function () {
console.log(i);
}, 1000);
}
然后你的for循环将调用execute(j):
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);
});
}
执行(j)将确保捕获j的上下文,直到异步方法执行之后。