所以我有一个包含我的信息的csv文件,我需要做一个质量add/update
exports.add_questions_from_file = function (file_path, surveyid, callback)
{
var U = [{}];
fs.readFile(file_path, 'utf8', function(err, data){
if (err){
console.log(err);
callback(err,null);
}else{
console.log(data);
d = data.split(/\r\n|\n/);
for (x=0;x <d.length;x++)
{
line = d[x].split(',');
if (line[0] == "") {return};
RQuestion.add_by_line (line,function (err, question)
{
U.push({id:question.id});
console.log(U);
});
}
}
});
Survey.update({_id:surveyid},{$push:{"SurveyQuestions":U}},function (err,numAffected, rawResponse) {
console.log(rawResponse);
RET = {"module":"survey","operation": "add", "status":"OK"};
callback(RET);
});
};
但即使我使用回调函数,更新似乎总是发生在同一个对象上,即使是console.log
这里
U.push({id:question.id});
console.log(U);
返回相同的对象(即使创建了所有其他对象)
我做错了什么?
答案 0 :(得分:0)
我看到了一些问题。
首先:
if (line[0] == "") {return};
你不打算使用休息或继续吗?否则,如果文件中的任何位置有空行,则整个函数将退出。这非常重要,因为Survey.update也不会被调用。
第二:我认为RQuestion.add_by_line和Survey.update正在做一些异步,比如更新数据库。您需要重新构建代码以等待这些异步项目完成,然后再继续下一步。我推荐一个名为async的npm包。
fs.readFile(file_path, 'utf8', function(err, data){
if (err){
console.log(err);
callback(err,null);
}else{
d = data.split(/\r\n|\n/);
async.map(d, function(line, callback) {
//this function is called for each line
add_by_line (line,function (err, question)
{
callback(err,{id:question.id});
});
}, function(err, results) {
//this function is called when all of the items are done
console.log("done with async");
console.dir(results);
Survey.update({_id:surveyid},{$push:{"SurveyQuestions":results},function (err,numAffected, rawResponse) {
console.log(rawResponse);
RET = {"module":"survey","operation": "add", "status":"OK"};
callback(RET);
});
});
}
});