var a = [1,2,3],
b = new Array();
a.forEach(function(each){
fs.readFile('test.html',function(){
b[b.length] = each;
})
})
console.log(b);//打印为[]
我希望在b被赋值后被打印出来,请问代码应该怎么改?
13 回复
var async = require('async');
var fs = require('fs');
var a = [1,2,3],
b = new Array();
async.forEach(a, function(each, cb){
fs.readFile('test.html', function(){
b[b.length] = each;
cb();
});
},function(){
console.log(b)
});
var a = [1,2,3];
var b = new Array();
async.forEach(a, function(each, cb){
fs.readFile('test.html', function(){
b[b.length] = each;
cb(null,each);
});
},function(err,results){
console.log(results);
});
我想用上面这种方式输出,为什么得到的results未定义?
@lsmsnail 将forEach 改成map 就可以,forEach 是不管结果的
var a = [1,2,3];
var b = new Array();
async.map(a, function(each, cb){
fs.readFile('test.html', function(){
b[b.length] = each;
cb(null,each);
});
},function(err,results){
console.log(results);
});
var nodeModulePath = path.join(__dirname, 'node_modules')
, nodeModules = fs.readdirSync(nodeModulePath);
, dependencies = {};
, emitter = new event.EventEmitter();
, num = 0;
, datetime = Date.now();
_.each(nodeModules, function(nodeModule) {
var jsonPath = path.join(nodeModulePath, nodeModule, 'package.json');
fs.readFile(jsonPath, function(err, data) { //回调是在NodeJS 执行 所以不用担心num同步累加
num ++;
if(err) return;
var packageJSON = JSON.parse(data);
dependencies[packageJSON.name] = packageJSON.version;
if(num == nodeModules.length) {
emitter.emit('end', null, null);
}
});
});
emitter.on('end', function() {
console.log(Date.now() - datetime);
fs.readFile('./test.json', function(err, data) {
if(err) return
var rootJSON = JSON.parse(data);
_.extend(rootJSON, {dependencies: dependencies});
fs.writeFile('./test.json', JSON.stringify(rootJSON), function(err) {
if(err) console.log('fialuer: %s', err);
else console.log('success');
});
});
});
昨晚也碰到这个问题,设置了个计数器 遍历结束触发,EventEmitter 回调函数就行了 这个看个人需求 我执行的时候耗时平均 4ms 而同样的例子使用async 耗时平均18ms