显示从Ajax请求获取数据

时间:2017-06-27 07:51:49

标签: javascript jquery arrays json ajax

我已经阅读了这篇文章How do I return the response from an asynchronous call?但是我无法提出解决方案。 我正在做ajax请求

function getdata(url) 
 {
 console.log('Started');
 jQuery.ajax({
 type: "GET",
 url: "http://myserver.com/myscript.php",
 dataType: "json",
 error: function (xhr) {
    console.log('Error',xhr.status);
        },
 success: function (response) {
   console.log('Success',response);

         }
    });
 }

并且当我说

时,控制台显示一切正常
var chinese = getdata();

获取数据。我一直在说:

  

未捕获的TypeError:无法读取此行的未定义错误的属性“长度”

var text = chinese[Math.floor(Math.random()*chinese.length)];

有人可以帮助我吗?

4 个答案:

答案 0 :(得分:1)

问题是您正在使用期望同步结果的异步方法。

因此,您应该使用异步调用结果中的代码,如下所示:

function getdata(url) {
  console.log('Started');
  jQuery.ajax({
    type: 'GET',
    url: url,
    dataType: 'json',
    error: function(xhr) {
      console.log('Error', xhr.status);
    },
    success: function(chinese) {
      var text = chinese[Math.floor(Math.random()*chinese.length)];
      // Do something else with text
    }
  });
}

getData('http://myserver.com/myscript.php');

我希望它有所帮助:)

答案 1 :(得分:0)

您得到的错误是因为调用的异步性质。我建议您在从以下API获得成功响应后分配值。

var chinese = getdata();

然后函数getdata()就像

function getdata(url) 
 {
 console.log('Started');
 jQuery.ajax({
 type: "GET",
 url: "http://myserver.com/myscript.php",
 dataType: "json",
 error: function (xhr) {
    console.log('Error',xhr.status);
        },
 success: function (response) {
     initChinese(response.data);

         }
    });
 }

并创建一个类似

的函数initChinese()
var text;
function initChinese(chinese){
 text = chinese[Math.floor(Math.random()*chinese.length)];
}

您还可以在全局范围内声明text变量,然后将值分配给text函数中的success变量,而无需创建新函数initChinese

答案 2 :(得分:0)

问题是你的getdata函数没有返回任何内容。在你的getdata函数中,你正在做一个ajax请求,这是一个异步请求。因此,您请求的数据不会,也不能使用您的getdata函数返回。

但是您将在成功函数中获得所请求的数据:

function getdata(url) 
 {
 console.log('Started');
 jQuery.ajax({
 type: "GET",
 url: "http://myserver.com/myscript.php",
 dataType: "json",
 error: function (xhr) {
    console.log('Error',xhr.status);
        },
 success: function (response) {
   console.log('Success',response);
var text = response[Math.floor(Math.random()*response.length)];
         }
    });
 }

由于我无法测试您的代码,您需要自己调试其余代码。但响应变量很可能是你的“中国”变量。

答案 3 :(得分:0)

您可以尝试使用回调,也可以查看Promises。

回调的想法是传递一个在ajax请求完成后运行的函数。该回调可以接受一个参数,在这种情况下是响应。

使用回调:



function getData(url, successCallback, errorCallback) {
  console.log('Started');

  jQuery.ajax({
    type: "GET",
    url: url,
    dataType: "json",
    error: function(xhr) {
      errorCallback(xhr.status);
    },
    success: function(response) {
      successCallback(response);
    }
  });
}

var chinese;

getData("http://myserver.com/myscript.php", function(response) {
  chinese = response; // you can assign the response to the variable here.
}, function(statusCode) {
  console.error(statusCode);
});




使用Promise(< IE11不支持):



function getData(url) {
  return new Promise(function(resolve, reject) {
    console.log('Started');
    
    jQuery.ajax({
      type: "GET",
      url: url,
      dataType: "json",
      error: function(xhr) {
        reject(xhr.status);
      },
      success: function(response) {
        resolve(response);
      }
    });
  });
}

var chinese;

getData("http://myserver.com/myscript.php").then(function(response) {
  chinese = response;
  console.log(chinese);
}, function(statusCode) {
  console.error(statusCode);
});