如何在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);
});
});
}
答案 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);
});
});
}