2016-03-14 2 views
0

У меня есть фикцию request.send();, которая анализирует .json файл, и получает credits током steamidJavascript JSON синтаксического анализа функция возвращает неопределенное значение

var request; 
if (window.XMLHttpRequest) { 
    request = new XMLHttpRequest(); 
} else { 
    request = new ActiveXObject("Microsoft.XMLHTTP"); 
} 

request.open('GET', './players.json'); 
request.onreadystatechange = function() { 
    if ((request.readyState === 4) && (request.status === 200)) { 
    var items = JSON.parse(request.responseText); 
    for(var i = 0; i < items.length; i++) 
    { 
     if(items[i].steamid == currentSteamID) 
     { 
     playerCredits = parseFloat(items[i].credits); 
     alert(playerCredits); 
     return playerCredits; 
     } 
    } 
    } 
} 

var playerCredits = request.send(); 
alert(playerCredits); 

первого оповещения работает отлично:

First Alert


Я хочу использовать кредиты позже, поэтому я назначил функцию переменной:

var playerCredits = request.send(); 

Но предупреждая playerCredits дать мне это:

Second Alert


При поиске похожих вопросов я узнал, что мне нужно было использовать Ответный, я попытался сделать это:

var request; 
if (window.XMLHttpRequest) { 
    request = new XMLHttpRequest(); 
} else { 
    request = new ActiveXObject("Microsoft.XMLHTTP"); 
} 
request.open('GET', './players.json'); 
request.onreadystatechange = function(callback) { 
    if ((request.readyState===4) && (request.status===200)) { 
    var items = JSON.parse(request.responseText); 
    for(var i = 0; i < items.length; i++) 
    { 
     if(items[i].steamid == currentSteamID) 
     { 
     playerCredits = parseFloat(items[i].credits); 
     callback(playerCredits); 
     } 
    } 
} 
} 

request.send(function() { 
    console.log(playerCredits); 
}); 

Однако это ошибка я получаю:

Uncaught TypeError: callback is not a function

Я уверен, что я не использую Обратный вызов, как я должен , и теперь я вас спрашиваю:

Что нужно изменить для этого?

+0

В вашем коде есть много несоответствий, вы, похоже, не знакомы с JavaScript. Я рекомендую вам найти точное значение важных ключевых слов, таких как Callback, XHR. Википедия - хорошее место для этого. Вероятно, я мог бы ответить, но сколько раз вы снова заходите? –

ответ

0

Передача функции в функцию .sendделает не передать его в onreadystatechange функции.

Вы можете воспользоваться закрытием, объявив свою функцию callback за пределами onreadystatechange.

var request = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP"); 

// Declare the function here 
function callback(playerCredits) { 
    console.log(playerCredits); 
    // Do other awesome stuff here 
} 

request.open('GET', './players.json'); 
request.onreadystatechange = function(callback) { 
    if ((request.readyState === 4) && (request.status === 200)) { 
     var items = JSON.parse(request.responseText); 
     for(var i = 0; i < items.length; i++){ 
      if(items[i].steamid == currentSteamID) { 
       var playerCredits = parseFloat(items[i].credits); 

       // It is still in scope here. 
       callback(playerCredits); 
      } 
     } 
    } 
} 

request.send(); 

Примечания:

  • Если бы я тебя, я бы вместо того, чтобы воспользоваться огромным массивом библиотек JavaScript, которые там уже рассматривались со всем этим. Я бы посмотрел на jQuery, если бы я был вами (у меня нет связи с jQuery).

    Это то, что ваш код будет выглядеть, если вы использовали JQuery:

    function callback(playerCredits) { 
        console.log(playerCredits); 
        // Do other awesome stuff here 
    } 
    
    $.ajax('./players.json', { 
        complete: function(response) { 
         var items = JSON.parse(request.responseText); 
         for(var i = 0; i < items.length; i++){ 
          if(items[i].steamid == currentSteamID) { 
           var playerCredits = parseFloat(items[i].credits); 
    
           // It is still in scope here. 
           callback(playerCredits); 
          } 
         } 
        } 
    } 
    
  • Я использовал console.log(playerCredits); вместо alert(playerCredits), потому что он является более универсальным. Если вы используете console.log объект в большинстве браузеров, вы увидите расширение объекта (а не [object Object], как вы бы получили от alert). (См. How to open the JavaScript console in different browsers?)

  • Я реорганизовал вашу декларацию request с помощью ternary operator.

  • Я объявлял playerCredits, используя ключевое слово var, чтобы сохранить его в пределах функции функции onreadystate. Объявление его без использования var делает его автоматически глобальной переменной.


Дополнительная литература:

0

Когда вы пишете

request.onreadystatechange = ... 

, что происходит после того, как =является обратного вызова

, что происходит в этих paranteses является, возможно, объект события , но вы найдете все, что нужно в вашем request объект. Таким образом, ваша функция обратного вызова не нуждается в каких-либо параметрах.

Имея callback(playerCredits);, не имеет никакого смысла.

Я точно не знаю, что вы хотите сделать. Обратный вызов - это функция, которая вызывается назад после возникновения определенного события.

Читать этой

https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/onreadystatechange

https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest

Надеется, что это помогает

0

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

Цитируя этот ответ: What is a callback function?

A callback function is a function which is:

  • passed as an argument to another function, and,
  • is invoked after some kind of event.

Они оба достичь того же, только разница в том, как они передаются интерпретатору.

Функция отправки является функцией void, и это означает, что она не возвращает никакого значения. Поэтому присвоение вашей функции отправки переменной означает ничего, если вы хотите использовать полученный ответ, тогда вам нужно назначить request.responseText переменной, но только после того, как мы получим ответ, а это значит, что в обработчике события.

Возможно, вы захотите ознакомиться с этим: https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest.

Но вы почти никогда не будете использовать собственный javascript для отправки ваших запросов ajax, jQuery - это библиотека, которая помогает вам делать такие вещи с легкостью: http://api.jquery.com/jquery.ajax/.

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