首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从双回调中提取值

从双回调中提取值
EN

Stack Overflow用户
提问于 2015-01-15 20:47:39
回答 2查看 163关注 0票数 0

如何通过双回调为全局变量赋值?

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

由于某种原因,我无法把头绕在这上面,虽然一开始看上去很琐碎。

代码语言:javascript
复制
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);
        });
    });
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-01-15 21:28:10

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

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

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

解决方案是重新考虑代码以处理异步调用。

代码语言:javascript
复制
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);
        });
    });
}

当然,您可以提供使用所需回调完成的函数。看看这段代码:

代码语言:javascript
复制
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);
        });
    });
}
票数 0
EN

Stack Overflow用户

发布于 2015-01-15 21:27:13

而不是声明resultValue为: var resultValue =someMethod(值);

您可以执行global.resultValue =someMethod(值);

这将使resultValue成为一个全局变量。

您可以使用global.resultValue在任何地方访问它。

同样,您也可以使用流程,而不是使用全局进程。

全局和进程是nodejs的全局对象,就像window用于javascript一样。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27972694

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档