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

时间:2017-04-19 14:48:20

标签: javascript node.js

我在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循环中创建多个文件并在每个文件中写入单独的数据?

1 个答案:

答案 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的上下文,直到异步方法执行之后。