异步事件中如何在闭包外打印出闭包的结果???
发布于 2年前 作者 lsmsnail 811 次浏览
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 回复

fs.readFile 是异步…

还是不懂怎么解决,我希望获取到b = [1,2,3]

@lsmsnail fs.readFileSync 试试看

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 是没定义啊,因为async的foreach 结果里没有result,只有err

@saber each不是应该会传值给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);

});

@hexie 额。。话说看到这里我也有了一个问题。。cb(null, each)这里给callback传参数为什么传不过去。。?我是新手。。

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

挺好的,不同的思路。学习

@hexie 嗯 折腾折腾 async刚上手 不太会

回到顶部