2017-01-20 6 views
0

Попытка получить мою голову вокруг HTTP-запросов и асинхронного поведения JavaScript.Обратный вызов Javascript XmlHttpRequest

function httpGetAsync(url, callback){ 
    var xmlHttp = new XMLHttpRequest(); 
    xmlHttp.onreadystatechange = function() { 
    if(xmlHttp.readyState == 4 && xmlHttp.status == 200){ 
     console.log(xmlHttp.responseText); // prints the ip address 
     callback(xmlHttp.responseText); 
    } 
    } 
    xmlHttp.open("GET", url, true) 
    xmlHttp.send(null); 

} 

httpGetAsync("http://httpbin.org/ip", function(){ 
    console.log(this); // doesn't print the ip address 
}) 

http-запрос просто прост, который возвращает ip-адрес в формате json запроса get. В определении функции IP-адрес может быть напечатан на консоль, только отлично, но в обратном вызове консоль выводит объект окна. this, вероятно, неправильно использовать, как мне получить доступ к данным в xmlHttp.responseText в обратном вызове?

ответ

1
callback(xmlHttp.responseText); 

Вы вызываете функцию. Вы передаете ему аргумент.

function(){ 
    console.log(this); // doesn't print the ip address 
} 

Ваша функция не ожидает получить какие-либо аргументы. Измените это, затем используйте этот аргумент.

function(my_argument){ 
    console.log(my_argument); 
} 

Смотрите также How does the “this” keyword work?

1

Вы звоните callback(xmlHttp.responseText), так что ...

httpGetAsync("...", function(response) { 
    console.log(response); 
}); 

просто!

Одна маленькая точка: Я бы рекомендовал поставить .open вызов перед темonreadystatechange, потому что в некоторых (старых) браузеров, заходящих .open сбросит обработчики событий.