如何通过双回调为全局变量赋值?
首先,我从文件中读取了一些值,当它完成时,我在回调中将它传递给一些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);
});
});
}发布于 2015-01-15 21:28:10
正如我在评论中所说的,您正在使用异步调用来加载文件。您希望将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);
});
});
}发布于 2015-01-15 21:27:13
而不是声明resultValue为: var resultValue =someMethod(值);
您可以执行global.resultValue =someMethod(值);
这将使resultValue成为一个全局变量。
您可以使用global.resultValue在任何地方访问它。
同样,您也可以使用流程,而不是使用全局进程。
全局和进程是nodejs的全局对象,就像window用于javascript一样。
https://stackoverflow.com/questions/27972694
复制相似问题