Извлечь значение из двойного обратного вызова
Как я могу присвоить значение переменной в глобальной от двойного обратного вызова?
Прежде всего, я читаю какое-то значение из файла, когда это сделано, я передаю его некоторому 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);
});
});
}
2 ответа
Как я уже сказал в моем комментарии, вы используете асинхронный вызов для загрузки файла. Вы хотите результат 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);
});
});
}