函数返回undefined而不是true / false

时间:2015-02-06 22:09:00

标签: javascript node.js

我正在使用lazy模块解析具有用户ID的文件,并检查特定用户是否在其中。 modCheck应该返回true / false,而是返回undefined。

var fs = require("fs");
var lazy = require("lazy");

function parseLineToString(line) {
    //checks to see if line is empty
    if (line == undefined) {
        return "";
    } else {
        return line.toString();
    }
}

function modCheck(channel, message) {
    var readStreamMC = fs.createReadStream("channel_mods/"+getChannelID(channel));
    //opens a read stream to a file depending on the string "channel"
    readStreamMC.on("end", function() {
        //after parsing all the lines, if it hasn't returned true, return false
        return false;
    });
    //using lazy to parse all the lines in a file
    new lazy(readStreamMC)
        .lines
        .forEach(function(line){
            //message.user is a 21 character user id
            if (parseLineToString(line).slice(0, 21) == message.user) {
                return true;
            }
        });
}

2 个答案:

答案 0 :(得分:1)

从它的外观来看,你的函数“modCheck”..而不是“isMod”......正在它的内部循环/ foreach之前终止/完成。

在这种情况下,你不能做一个简单的返回值..因为它会在它返回一个返回值之前点击modCheck函数的最后一行......

如果你返回true / false,你应该调用一个函数来处理真/假的事件...

如果需要可以显示示例,但只需将“返回”行更改为更像“modCheckComplete(true)”的行,并使用名为modCheckComplete的函数继续返回通常会退回到调用代码的位置

var fs = require("fs");
var lazy = require("lazy");

function parseLineToString(line) {
    //checks to see if line is empty
    if (line == undefined) {
        return "";
    } else {
        return line.toString();
    }
}

function modCheck(channel, message) {
    var readStreamMC = fs.createReadStream("channel_mods/"+getChannelID(channel));
    //opens a read stream to a file depending on the string "channel"
    readStreamMC.on("end", function() {
        //after parsing all the lines, if it hasn't returned true, return false
        modCheckComplete(false);  /* CHANGED THIS */
    });
    //using lazy to parse all the lines in a file
    new lazy(readStreamMC)
        .lines
        .forEach(function(line){
            //message.user is a 21 character user id
            if (parseLineToString(line).slice(0, 21) == message.user) {
                modCheckComplete(true); /* CHANGED THIS */
            }
        });
}

/* ADDED THIS */
function modCheckComplete(bResult) {
    if (bResult==true) {
        alert('user successful');
    } else {
        alert('user failure');
    }
}

答案 1 :(得分:0)

一旦函数使用异步处理块(如lazy部分),就无法将其转换回同步调用(即将某些内容“返回”给调用者)。

你唯一能做的就是接受一个或两个带闭包的额外参数来调用结果或错误,换句话说你也需要发布一个异步接口。

Node.js例如提供readFileSync因为只有readFile才能构建一个{。}}。