从双回调中提取值

时间:2015-01-15 20:47:39

标签: javascript node.js callback fs

如何在double回调中为全局变量赋值?

首先,我从文件中读取了一些值,当它完成时,我将它传递给回调中的某个fn,并希望在初始范围内使用结果值,在回调之外。

出于某种原因,我无法绕过这个,尽管起初它看起来微不足道。

var done = function(err, value) {
    if (err) {
        return;
    }
    var resultValue = someMethod(value);
};


loadFile(done);

var resultVal = ?? //result value needed here

function loadFile(done) {
    fs.realpath(filePath, function (err, resolvedPath) {
        if (err) {
            return done(err);
        }

        fs.readFile(resolvedPath, function (err, value) {
            if (err) {
                return done(err);
            }
            return done(null, data);
        });
    });
}

2 个答案:

答案 0 :(得分:0)

而不是将resultValue声明为:var resultValue = someMethod(value);
你可以做global.resultValue = someMethod(value);
这将使resultValue成为全局变量 您可以使用global.resultValue在任何地方访问它。

同样,您也可以使用流程,而不是使用全局 global和process是nodejs的全局对象,就像window是javascript一样。

答案 1 :(得分:0)

正如我在评论中所说,您正在使用异步调用来加载文件。您希望someMethod的结果存储在全局变量 resultVal中。除非这是不可能的。

当您致电loadFile(done)时,会对服务器进行异步调用。此呼叫正在由一个事件解决。如果事件返​​回200,则服务器返回预期答案。如果它们是错误,则会传递给done,否则将传递data。我们说这需要250 ms才能解决。

同时JavaScript继续解析代码,因为调用是异步的,在单独的线程中运行,因此不会停止主线程的执行。解析的下一行是returnVal。但是,调用尚未解决,因为在调用函数1 ms之后,此行会被执行loadFile。这留下了249 ms的差距。

解决方案是重新考虑您的代码以应对异步调用。

var done = function(err, value) {
    if (err) {
        return;
    }
    var resultValue = callBack(value);
};


loadFile(done);

function someMethod(value)
{
    //execute whatever you want to do here!
}

function loadFile(done) {
    fs.realpath(filePath, function (err, resolvedPath) {
        if (err) {
            return done(err);
        }

        fs.readFile(resolvedPath, function (err, value) {
            if (err) {
                return done(err);
            }
            return done(null, data);
        });
    });
}

当然,您可以使用所需的回调来完成功能。看看这段代码:

var done = function(err, value, callBack) {
    if (err) {
        return;
    }
    var resultValue = someMethod(value);
};


loadFile(done, method1);

function method1(value)
{
    //execute whatever you want to do here!
}

function loadFile(done, callBack) {
    fs.realpath(filePath, function (err, resolvedPath) {
        if (err) {
            return done(err);
        }

        fs.readFile(resolvedPath, function (err, value) {
            if (err) {
                return done(err);
            }
            return done(null, data, callBack);
        });
    });
}