从双重回调中提取价值
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);
});
});
}
如何从双重回调中为全局变量赋值?
首先,我从文件中读取了一些值,完成后,我将它传递给回调中的某个 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);
});
});
}