node.js - 这个实例得到更新?

时间:2014-10-24 09:21:06

标签: javascript node.js

我是Node.js的新手。在等待之前我明白了#34;即在fileRead方法返回值" data"之前应该是未定义的,但是在等待一秒后它不应该保持一个值,并且fileRead函数肯定已经返回了一个值。请在下面找到代码..

这是一个在fileReader.js中读取文件的简单代码:

exports.fileRead = function(callback){
    var fs = require('fs');

    var f;
    var b = new Buffer(10000);

    fs.open('package.json', 'r', function(err, handle){
        f = handle;
        console.log("reading");

        fs.read(f, b, 0, 10000, null, function(err, bytesRead){
            console.log("read complete!");
            fs.close(f);
            callback();
            console.log("returning");
            return b.toString('utf8',0,bytesRead);
        });
    });
}

这是一个"导入" fileReader" module" (让我知道我的术语是否错误):

var filePrinter = require('./fileReader.js');
var data;
data = filePrinter.fileRead(function(){
    console.log("before waiting -\n"+ data);
});

setTimeout(function(){
    console.log("after waiting -\n" + data);
},1000);

控制台在运行时吐出这个:
阅读
阅读完成!
在等待之前 -
未定义
返回
等待后 -
未定义

我知道下面的代码使用回调传递一个参数会工作得很好,但上面代码中的问题是什么?

//fileReader.js
    exports.fileRead = function(callback){
        var fs = require('fs');

        var f;
        var b = new Buffer(10000);

        fs.open('package.json', 'r', function(err, handle){
            f = handle;
            console.log("reading");

            fs.read(f, b, 0, 10000, null, function(err, bytesRead){
                console.log("read complete!");
                fs.close(f);
                callback(b.toString('utf8',0,bytesRead));
            });
        });
    }

// =============================

    var filePrinter = require('./fileReader.js');

    var data = null;
    data = filePrinter.fileRead(function(b){
        data = b;
        console.log("before waiting -\n"+ data);
    });

    setTimeout(function(){
        console.log("after waiting -\n" + data);
    },1000);

2 个答案:

答案 0 :(得分:0)

您的fileRead函数永远不会返回任何内容,因此调用它的结果为undefined。您拥有的return b.toString来自您提供的回调函数 {。}}。

要使其工作,您需要修改read以将数据传递给自己的回调函数:

fileRead

然后像这样称呼它:

exports.fileRead = function(callback){
    var fs = require('fs');

    var f;
    var b = new Buffer(10000);

    fs.open('package.json', 'r', function(err, handle){
        f = handle;
        console.log("reading");

        fs.read(f, b, 0, 10000, null, function(err, bytesRead){
            console.log("read complete!");
            fs.close(f);
            callback(b.toString('utf8',0,bytesRead)); // <==== Here
            console.log("returning");
        });
    });
};

使用 var data; // No need for = null here, but you could add it back if you want filePrinter.fileRead(function(b){ // <== Data received by callback as `b` data = b; // <== Now assigned to `data` console.log("in callback -\n"+ data); }); 的适当位置来自该回调,而不是data回调,实际上没有理由拥有setTimeout变量完全 - 只需在回调中使用data

答案 1 :(得分:0)

上面代码中的问题是从回调中返回的值从未使用过(并不打算使用) - 看看如何从fs.read

调用回调