从双重回调中提取价值

Extract value from double callback

如何从双重回调中为全局变量赋值?

首先,我从文件中读取了一些值,完成后,我将它传递给回调中的某个 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);
        });
    });
}

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

在任何地方访问它

同样,除了使用 global,您还可以使用 process。
global 和 process 是 nodejs 的全局对象,就像 window 是 javascript.

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

当您调用 loadFile(done) 时,将对服务器进行异步调用。此呼叫正在由一个事件解决。如果事件 returns 200 服务器返回了预期的答案。如果他们是一个错误,它将被传递给 done,如果不是,则 data 将被传递。假设这需要 250 ms 来解决。

同时JavaScript继续解析代码,因为调用是异步的,运行在一个单独的线程中,因此不会停止主线程的执行。被解析的下一行是 returnVal。但是调用尚未解决,因为此行在调用函数 loadFile 后执行 1 ms。这留下了 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);
        });
    });
}