如何在Node.JS的循环中正确使用异步函数

时间:2015-03-17 14:53:24

标签: javascript node.js for-loop asynchronous fs

我的代码需要一行,并试图从Google转换MP3格式。

但是,对于异步函数fs.exists(...),循环太快,并且只获取数组中的最后一行。我猜测循环正在改变变量filenameline,甚至在它们被请求之前。

对此有什么好处?我可以看到使用fs.existsSync(...)作为一种可能的解决方案,但是有一个更好的吗?

for (var i = 0, length = lines.length; i < length; i++) {
    // Get the line in question
    var line = lines[i].trim();

    // The saving filename
    var filename = crypto.createHash('md5').update(line).digest('hex') + ".mp3";

    // Does the file exist?
    fs.exists(filename, function(exists) {
        console.log(line + "->" + filename);
        // We have to process it!
        if (!exists) {
            request
                .get({
                    'url': url,
                    'qs': {
                        'tl': lang,
                        'q': line,
                        'ie': 'UTF-8'
                    }
                })
                .on('error', function(error) {
                    console.error(error);
                })
                .on('response', function(response) {
                    if (response.statusCode != 200) {
                        console.error(response);
                    }
                })
                .pipe(fs.createWriteStream(filename));
        }
    });
}

0 个答案:

没有答案