2015-04-02 2 views
0

Я создаю пользовательскую библиотеку javascript для проекта im, создающего, и у меня возникли проблемы с передачей данных из библиотеки на веб-страницу. В основном я создаю свою собственную библиотеку запросов HTTP. Когда я пытаюсь установить var в возвращаемое значение из моей библиотеки, вызовите так:Возврат данных из пользовательской библиотеки javascript undefined

var data = Cynergi.get(); 
console.log(data); shows undefined. 

Это мой код библиотеки.

(function(window){ 
    function defineCynergi(){ 
      var Cynergi = {}; 
      Cynergi.alert = function(){ 
       alert("this is a cynergi test"); 
      } 

      Cynergi.get = function(){ 
        var data = getData(); 
      } 
      return Cynergi; 
     } 
    if(typeof(Cynergi) === 'undefined'){ 
     window.Cynergi = defineCynergi(); 
    } 
})(window); 

function getData(){ 
    var xhr = new XMLHttpRequest(); 
    xhr.open('GET', encodeURI('http://thewaywardjourney.com:3000/computer_stats?order=time.asc')); 
    xhr.onload = function() { 
     if (xhr.status === 200) { 
      //alert('User\'s name is ' + xhr.responseText); 
      var data = JSON.parse(xhr.responseText); 
      console.log(data); 
     } 
     else { 
      //alert('Request failed. Returned status of ' + xhr.status); 
      //data = JSON.parse(xhr.responseText); 
     } 
    return data; 
    }; 
    xhr.send(); 
} 

Я еще не параметрировал функцию, потому что я пытался понять, как все это работает в первую очередь.

ОК, так что моя попытка обратного вызова в соответствии с предложением и все еще не работает. Теперь я получаю undefined, это не функция в консоли и im, следуя сообщению стека, как было предложено.

function getData(args, callback){ 
    var xhr = new XMLHttpRequest(); 
    xhr.open('GET', encodeURI('http://thewaywardjourney.com:3000/computer_stats?order=time.asc')); 
    xhr.onload = function() { 
     if (xhr.status === 200) { 
      callback(xhr.responseText); 
     } 
     else { 
     } 
    }; 
    xhr.send(); 
    return; 
} 

OK ПОЭТОМУ Я получил это работает, но я наклоняю доступ к данным:

Это то, что я называю: updateComputerdata(); var data = Cynergi.get(); console.log (data.data)

Object {data: null, setData: function} 
data: Array[62] 
setData: function (data){ this.data = data;} 
__proto__: Object 


(function(window){ 
    function defineCynergi(){ 
      var Cynergi = {}; 
      Cynergi.alert = function(){ 
       alert("this is a cynergi test"); 
      } 
      Cynergi.get = function(){ 
        var ret_data = { 
         data: null, 
         setData: function(data){ this.data = data;} 
        } 
        getData(ret_data); 
        return ret_data; 
      } 
      return Cynergi; 
     } 
    if(typeof(Cynergi) === 'undefined'){ 
     window.Cynergi = defineCynergi(); 
    } 
})(window); 

function getData(ret_data){ 
    var the_data = { 
     data: null, 
     setData: function(data){ this.data = data;} 
    } 
    var xhr = new XMLHttpRequest(); 
    xhr.open('GET', encodeURI('http://thewaywardjourney.com:3000/computer_stats?order=time.asc')); 
    xhr.onload = function() { 
     if (xhr.status === 200) { 
      the_data.setData(JSON.parse(xhr.responseText)); 
     } 
     else { 
      the_data.setData(JSON.parse(xhr.responseText)); 
     } 
    }; 
    xhr.send(); 
    ret_data.setData(the_data); 
    return the_data; 
} 

если вы видите это изображение первый один является ret_data, а затем второй объект в этом консольный вывод ret_data.data вы можете увидеть, что в выходном объекте второй консоли, что data имеет массив и в первом, прежде чем я назвал .data, это был вложенный объект. однако, если я вызываю ret_data.data.data, потому что это значение данных вложенных объектов, но оно возвращает null, а im не уверен, почему и как его исправить.

updated code 

(function(window){ 

    function defineCynergi(){ 

      var Cynergi = {}; 

      Cynergi.get = function(){ 

        var ret_data = { 

         data_returned: null, 

         setData: function(data_returned){ this.data_returned = data_returned;} 

        } 

        getData(ret_data); 

        console.log(ret_data); 

        return ret_data; 

      } 

      return Cynergi; 

     } 

    if(typeof(Cynergi) === 'undefined'){ 

     window.Cynergi = defineCynergi(); 

    } 

})(window); 



function getData(ret_data){ 



    var the_data = { 

     data: null, 

     setData: function(data){ this.data = data;} 

    } 

    var xhr = new XMLHttpRequest(); 

    xhr.open('GET', encodeURI('http://thewaywardjourney.com:3000/computer_stats?order=time.asc')); 

    xhr.onload = function() { 

     if (xhr.status === 200) { 

      the_data.setData(JSON.parse(xhr.responseText)); 

     } 

     else { 

      the_data.setData(JSON.parse(xhr.responseText)); 

     } 

    }; 

    xhr.send(); 

    ret_data.setData(the_data); 

    return the_data; 



} 



      //alert('User\'s name is ' + xhr.responseText); 

      //var data = JSON.parse(xhr.responseText); 

      //alert('Request failed. Returned status of ' + xhr.status); 

      //data = JSON.parse(xhr.responseText); 

      //console.log(data); 

enter image description here

нормально, поэтому я изменил его немного

(function(window){ 
    function defineCynergi(){ 
      var Cynergi = {}; 
      var returned_data; 
      Cynergi.get = function(){ 
       getData('http://127.0.0.1:3000/computer_stats?order=time.asc', sendData); 
      } 
      return Cynergi; 
     } 
    if(typeof(Cynergi) === 'undefined'){ 
     window.Cynergi = defineCynergi(); 
    } 
})(window); 

function getData(url, callback){ 

    var xhr = new XMLHttpRequest(); 
    xhr.open('GET', encodeURI(url)); 
    xhr.onload = function() { 
     if (xhr.status === 200) { 
      callback(JSON.parse(xhr.responseText)); 
     } 
     else { 
      callback(JSON.parse(xhr.responseText)); 
     } 
    }; 
    xhr.send(); 
} 

function sendData(ret_data){ 
    returned_data = ret_data; 
    console.log(ret_data); // this works but it doesnt send the data back. 
} 

HTML КОД:

<!DOCTYPE HTML> 
<html> 
    <head> 
     <title>TheWayWardJourney</title> 
     <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script> 
     <script src="cynergi.js"></script> 
     <script> 
      var data = Cynergi.get(); 
      console.log(data); 

      //$.each(data, function(i, item) { 
      // console.log(item); 
      //}); 
      //console.log(data.data_returned); 
     </script> 
     <style> 
        #messages_modal{ 
          position:fixed; 
          top: 30%; 
          left: 50%; 
          width:60%; 
          height:500px; 
          margin-top: -9em; /*set to a negative number 1/2 of your height*/ 
          margin-left: -15em; /*set to a negative number 1/2 of your width*/ 
          border-radius:15px; 


        } 
        #circular { 
         width: 40px; 
         height: 40px; 
         border-radius: 150px; 
         -webkit-border-radius: 150px; 
         -moz-border-radius: 150px; 
         background: url(images/avatar.jpg) no-repeat; 
        } 
     </style> 
     <!--[if lte IE 9]><link rel="stylesheet" href="css/ie/v9.css" /><![endif]--> 
     <!--[if lte IE 8]><link rel="stylesheet" href="css/ie/v8.css" /><![endif]--> 
    </head> 
    <body> 
           <p style='text-align:left;align:left;' id='computer_info'></p></p> 
           <p style='text-align:left;align:left;' id='computer_stats'></p></p> 

    </body> 
</html> 

console.log (данные); выходы неопределенные

+0

Вам нужно использовать обратные вызовы/обещания для вашей функции – MultiplyByZer0

+0

@ MultiplyByZer0 пример? –

+3

Возможный дубликат [Как я могу вернуть значение из запроса AJAX?] (Http://stackoverflow.com/questions/2956261/how-can-i-return-a-value-from-an-ajax-request) – Adam

ответ

0

Сделать эту линию работы:

Cynergi.get(function (data) { console.log(data); }); 
+0

эй человек, который я обновил в соответствии с этим учебником, который вы отправили, но все еще ничего не смотрел выше, опубликовал обновленный код :) –

0

Вы не возвращает данные в Cynergie.get

Изменить эту строку:

function sendData(ret_data){ return ret_data; }

Или просто добавить return к вашей функции getData и вырезать обратный вызов, если вам не нужно принимать альтернативные обратные вызовы.

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