我是javascript的新手,目前我正在尝试回调我的脚本。此脚本应返回对象数组中的缩小词
var fs = require('fs')
var dict = ['corpus.txt','corpus1.txt','corpus2.txt'];
mapping(dict, function(error,data){
if(error) throw error
console.log(data)
})
function mapping(list, callback){
var txtObj = []
list.forEach(function (val) {
readFile(val, function(error,data){
txtObj.push(data)
})
})
function readFile(src, cb){
fs.readFile(src,'utf8', function (error,data) {
if (error) return callback(error,null)
return mapred(data)
})
}
return callback(null,txtObj)
}
但它返回空数组。任何帮助,将不胜感激。 谢谢!
答案 0 :(得分:3)
`fs.readFile`
是一个异步函数,在它完成并调用结果回调之前,你将返回空的txtObj
数组。
如何解决?
在return callback(null,txtObj)
完成运行后调用fs.readFile
。
而且,当你在一个项目数组上逐个运行异步函数时,它可能仍然不能按照你想要的方式工作。可能想在nodejs中使用modudles
async
这是一个使用模块异步的异步版本。强烈反对同步文件操作:)
var fs = require('fs')
var dict = ['corpus.txt','corpus1.txt','corpus2.txt'];
mapping(dict, function(error,data){
if(error) throw error
console.log(data)
})
function mapping(list, callback){
var txtObj = [],
async = require('async');
async.each(list, readFile, function(err) {
callback(err,txtObj)
});
function readFile(src, cb) {
fs.readFile(src,'utf8', function (error,data) {
if (error) {
cb(error);
}
else {
txtObj.push(mapred(data));
cb(null);
}
})
}
}
编辑:您可以在没有异步的情况下执行此操作,但它有点脏不是吗?如果您删除forEach中的自调用函数也可以,我包括在内即使在回调完成后你也可以访问val
var fs = require('fs')
var dict = ['corpus.txt','corpus1.txt','corpus2.txt'];
mapping(dict, function(error,data){
if(error) throw error
console.log(data)
})
function mapping(list, callback){
var txtObj = [],
counter = list.length,
start = 0;
list.forEach(function (val) {
(function(val)
readFile(val, function(error,data) {
txtObj.push(data);
start++;
if(error || (start === counter)) {
callback(error,txtObj);
}
}))(val);
})
function readFile(src, cb) {
fs.readFile(src,'utf8', function (error,data) {
if (error) {
cb(error);
}
else {
txtObj.push(mapred(data));
cb(null);
}
})
}
}
答案 1 :(得分:1)
您获得空数组结果的原因是您在readFile函数有机会填充数组之前执行回调。您正在执行多个异步操作,但在继续操作之前不要让它们完成。
如果只有一个异步操作,你可以在readFile的回调函数中调用callback()
,但是因为你需要在调用callback()
之前执行多个异步操作,你应该考虑使用{{1 }}
有时无法避免同步。
fs.readFileSync()