回调问题

时间:2016-01-14 10:40:20

标签: javascript node.js callback

我是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)
}

但它返回空数组。任何帮助,将不胜感激。 谢谢!

2 个答案:

答案 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()