【发布时间】:2015-08-02 12:30:51
【问题描述】:
我正在尝试运行一个函数,一旦该函数完成,然后运行另一个函数。第一个函数读取一个 CSV 文件,发出一个 GET 请求,然后构建一个对象。第二个函数使用新创建的对象来创建一个新的 CSV 文件。
我遇到的问题是新的 CSV 文件是在 GET 请求完成之前创建的。
我正在使用 async.parallel 设置流程,但无法正确获取逻辑。
我很想知道我做错了什么并更好地了解 node 是如何看待这些任务的。
// Require
var request = require('request');
var fs = require('fs');
var json2csv = require('json2csv');
var csv = require('csv');
var async = require('async');
// Params
var emailHunter_apiKey = '0000';
var emails = [];
var fields = ['email'];
var i = 0;
// Start
async.parallel([
function(callback){
setTimeout(function(){
var file = fs.readFileSync('file.csv');
csv.parse(file, {delimiter: ','}, function (err, data) {
for (var key in data) {
if (i < 5) {
if (data.hasOwnProperty(key)) {
var h = data[key];
if (h[5] != '') {
var url = h[5];
url = url.replace('//', '');
url = url.replace('www.', '');
request('https://api.emailhunter.co/v1/search?domain=' + url + '&api_key=' + emailHunter_apiKey + '', function (error, response, body) {
if (!error && response.statusCode == 200) {
var json = JSON.parse(body);
for (var subObj in json) {
if (json.hasOwnProperty(subObj) && subObj == 'emails') {
var emailObj = json[subObj];
for (var key in emailObj) {
var email = {
'email': emailObj[key]['value']
};
emails.push(email);
}
}
}
}
});
}
}
}
i++;
}
});
callback(null, emails);
}, 200);
console.log(emails);
}
],
function(err, results){
json2csv({data: results, fields: fields}, function (err, csv) {
if (err) console.log(err);
fs.writeFile('export.csv', csv, function (err) {
if (err) throw err;
console.log('file saved');
});
});
console.log(results);
});
【问题讨论】:
-
首先,您使用
async.parallel错误,因为您的第一个参数中只有 1 个函数。它应该采用一组(多个)函数。其次,我认为 Promises 可能更适合您的需求,请查看这些。基本上,您依赖于request(这是异步的)的多次执行完成,因此您需要对其进行承诺并检查所有承诺何时已解决。当您发现 Promise 时,您将了解更多有关它的信息。最后,为了便于阅读,您的代码是 callback-hell which you should avoid。 -
感谢您浏览此内容。我肯定在尝试围绕回调结构并了解节点的想法/工作方式。这对于 promise 的建议也是有意义的。再次感谢您的帮助!
标签: node.js loops csv asynchronous