Извлечь значение из двойного обратного вызова

Как я могу присвоить значение переменной в глобальной от двойного обратного вызова?

Прежде всего, я читаю какое-то значение из файла, когда это сделано, я передаю его некоторому 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);
        });
    });
}

Вместо decl

Другие вопросы по тегам