Javascript области действия функции, возвращая за пределы функции - PullRequest
0 голосов
/ 12 марта 2012

У меня есть эта функция в JS:

 function redGet(key){
    var response;
    red.get(key, function (err, reply) {
            response = reply;
        });
    return response;
    }

Это возвращает неопределенное значение:

console.log(redGet("hello"));

Ответы [ 4 ]

2 голосов
/ 12 марта 2012

Предполагая, что red.get() является AJAX-подобной асинхронной функцией, проблема в том, что вы ожидаете, что она будет работать синхронно.Вы не сможете получить значение reply до завершения асинхронной операции, что означает, что все, что зависит от этого значения, должно вызываться в функции обратного вызова.

Например:

function redGet(key){
    red.get(key, function (err, reply) {
        // do whatever you need to do with the reply value here
        console.log(reply);
    });
}

redGet("hello");
0 голосов
/ 12 марта 2012

Вы можете использовать функцию jquery $ .ajax с опцией async: false. Может быть, красная переменная использует функцию jquery $ .ajax внутри, и вы можете сделать это. Но это повлияет на производительность. Более подробная информация о http://api.jquery.com/jQuery.ajax/

0 голосов
/ 12 марта 2012

Я полагаю, что ваш red.get является вызовом функции ajax (который является асинхронным)

Что произойдет, если ваш console.log(..) будет выполнен до того, как red.get(..) вернет результат.

Если вы все еще хотите, чтобы он работал, вы должны передать ему обратный вызов, например,

redGet('hello', function(res) {
    alert(res)
})

// then in your code 
function redGet(key, cb){
    red.get(key, function (err, reply) {
        cb(reply)
    });
}
0 голосов
/ 12 марта 2012

Вы не говорите, что такое red, но, скорее всего, его метод .get() является асинхронным , что означает, что выполнение redGet() немедленно продолжается с return response, в этот момент значение - это не определено. Только после того, как .get() завершит свою обработку, ваша функция обратного вызова будет установлена ​​для установки response - reply.

Как и в случае любого асинхронного кода (также встречающегося в Ajax, доступе к базе данных и т. Д.), Вам, вероятно, потребуется реструктурировать свой код таким образом, чтобы все, что зависит от возвращаемого значения из .get(), выполнялось в вашей функции обратного вызова (или в другие функции, вызываемые из функции обратного вызова).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...