2015-01-26 3 views
-2

У меня есть функции, приведенные ниже:Javascript Ответный

(Обычно я получаю переменную Сообщ делая некоторые запрос на XML Object)

function getMsg(callback) { 
    var msg = "test"; 
    callback(msg); 
} 

function msgDone() { 
    var message = null; 

    getMsg(function(msg) { 
     message = msg; 
    }); 

    return message; //Why is message undefined here? 
} 

Моя проблема заключается в том, что я получаю неопределенная на сообщение , Я проверил функцию getMsg(), и он вернул правильное значение.

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

Благодаря

+0

Я не вижу проблему, она возвращается правильное значение – Nano

+1

Это может пригодиться: HTTP : //stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-ajax-call – georg

ответ

0

Почему не определено здесь сообщение?

Это не будет, в коде в этом вопросе, но я думаю, что реальная getMsg является асинхронным операции. То есть, когда вы вызываете это, он начинает процесс получения сообщения, но этот процесс завершает позже, а не сразу. (Например, типичный Ajax вызов, как это.)

В этом случае причина message не определена в том месте, вы отметили, что обратный вызов не был вызван, так что ничто никогда не назначается message. Вы не можете вернуть результат асинхронного вызова от функции; вместо этого вы должны предоставить собственный механизм обратного вызова (простые обратные вызовы или обещания или аналогичные). Например:

function getMsg(callback) { 
    // Do something asynchronous... 
    // It's done, call the callback 
    callback(/*...the data retrieved asynchronously...*/); 
} 

function msgDone(callback) { 
    getMsg(function(msg) { 
     // Presumably you do more processing here... 
     // ...and then call the callback 
     callback(msg); 
    }); 
} 

Затем, вместо того, чтобы:

var msg = msgDone(); 
doSomethingWith(msg); 
doSomethingElseWith(msg); 

вы:

msgDone(function(msg) { 
    doSomethingWith(msg); 
    doSomethingElseWith(msg); 
}); 
Смежные вопросы