2013-10-10 3 views
2

Я пытаюсь присвоить значение переменной val в коде ниже:Возврат значения из onreadystatechange событий в AJAX

var cmdValue = "/cmd/fetch?x="; 
var val; 
var returned_data; 

function what(){ 
    val = update('#TAG#'); 
} 


function update(tag) { 
    var req1 = newXMLHttpRequest(); 
    req1.open("GET",cmdValue + tag, true); 
    req1.send(""); 

    return req1.onreadystatechange= function() { 
     if (req1.readyState == 4 && req1.status == 200) { 
      returned_data = req1.responseText; 
      return returned_data; 
     }else{ 

     } 
    }; 
} 

Я отслеживания переменных в Firebug и получается, что val получает назначен функция. Есть ли способ заставить код работать, а затем присваивать значение переменной val?

+1

http://stackoverflow.com/questions/6847697/how-to-return-value-from-callback-function – 0xcaff

+0

как 'val' - глобальная переменная (которая в наши дни не очень рекомендуется), вы можете сделать 'var = return_data;' –

+0

Я держал val как глобальный, чтобы отслеживать его в firebug. Вы имеете в виду val = return_data? – Superios

ответ

5

В асинхронном программировании вы делать неreturn данные, потому что вы не знаете, когда что данные станут доступными - они асинхронны.

Способ асинхронного программирования использует события и/или обратные вызовы.

Пример:

var cmdValue = "/cmd/fetch?x="; 
var val; 
var returned_data; 
var performSomeAction = function(returned_data) { 
    val = returned_data; 
} 

function what(){ 
    update('#TAG#',performSomeAction); 
} 



function update(tag,callback) { 
    var req1 = newXMLHttpRequest(); 
    req1.open("GET",cmdValue + tag, true); 
    req1.send(""); 

    req1.onreadystatechange= function() { 
     if (req1.readyState == 4 && req1.status == 200) { 
      returned_data = req1.responseText; 
      //fire your callback function 
      callback.apply(this,[returned_data]); 
     }else{ 

     } 
    }; 
} 

Этот вопрос является одним из наиболее часто задаваемых вопросов по SO, по крайней мере, когда речь идет о яваскрипте тега - пожалуйста, поиск подобных вопросов, прежде чем задавать свой собственные.

+0

Это очень сложно, как новичок в js, потому что я никогда не знаю правильных ключевых слов. Да, я уже нашел аналогичный вопрос. Спасибо хоть. – Superios

+0

Что делать, если я работаю с синхронным кодом (последний аргумент для открытия - false)? – Niko

+0

@Niko Вы никогда не должны устанавливать аргумент 'async' в' false'. Это заблокирует браузер до тех пор, пока сервер не ответит. Всегда используйте правильные асинхронные методы. –

-1
// should have a space after new or was did u notice it 
var req1 = new XMLHttpRequest(); 
+0

К сожалению, есть объект/функция, называемый 'newXMLHttpRequest' – Superios

+0

Эта функция просто проверяет, является ли браузер IE или нет, а затем создает объект XMLHttpRequest. – Superios

Смежные вопросы