我已经阅读了这篇文章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)];
有人可以帮助我吗?
答案 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);
});