Я создаю пользовательскую библиотеку 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);
нормально, поэтому я изменил его немного
(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 (данные); выходы неопределенные
Вам нужно использовать обратные вызовы/обещания для вашей функции – MultiplyByZer0
@ MultiplyByZer0 пример? –
Возможный дубликат [Как я могу вернуть значение из запроса AJAX?] (Http://stackoverflow.com/questions/2956261/how-can-i-return-a-value-from-an-ajax-request) – Adam