我意识到这个问题很多,通常答案是AJAX是异步的,这就是为什么它返回undefined,但即使我在这里将异步设置为false,它仍然返回undefined当函数被调用时。 res始终未定义
function sendRequest(link, type, query) {
$(document).ready(function(){
$.ajax({
'url' : link,
'type' : type,
'data' : query,
'async' : false,
'dataType': "json",
'headers': {
'Cache-Control':'max-age=0',
'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Content-Type':'application/x-www-form-urlencoded',
'Accept-Language':'en-US,en;q=0.8,ar;q=0.6',
},
'success': function(data) {
var res = data;
}
});
});
return res;
}
此外,我确信请求正确发送,并且响应也正确接收
答案 0 :(得分:2)
您必须单独声明和分配res
。
var res;
$.ajax({
// ...
'success': function (data) {
res = data;
}
});
return res;
目前,res
仅在success
回调中被声明为局部变量。因此,sendRequest()
的剩余部分无法访问它。
但是,您应该尽量避免在Ajax上使用async: false
。
您可以return
Deferred
由$.ajax()
提供的function sendRequest(link, type, query) {
return $.ajax({
// ...
});
}
sendRequest(...).done(function (data) {
// ...
});
jqXHR,允许调用函数添加自己的处理程序。
{{1}}中描述了更多详细信息和选项
答案 1 :(得分:2)
我认为更好的方法是让sendRequest
函数返回jQuery Promise Object。作为一个例子
function sendRequest(link, type, query) {
return $.ajax({
'url' : link,
'type' : type,
'data' : query,
'dataType': "json",
'headers': {
'Cache-Control':'max-age=0',
'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Content-Type':'application/x-www-form-urlencoded',
'Accept-Language':'en-US,en;q=0.8,ar;q=0.6',
}
});
}
使用
sendRequest('/someurl', 'GET', {}).done(function(data) {
// do whatever you need with data here
});
答案 2 :(得分:0)
首先 res
应该在ajax范围之外,并且其次函数将在ajax调用完成之前返回,这就是未定义的原因:
$(document).ready(function(){
$.ajax({
'url' : link,
'type' : type,
'data' : query,
'async' : false,
'dataType': "json",
'headers': {
'Cache-Control':'max-age=0',
'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Content-Type':'application/x-www-form-urlencoded',
'Accept-Language':'en-US,en;q=0.8,ar;q=0.6',
},
'success': function(data) {
MyFunction(data);
}
});
function MyFunction(data)
{
// do with ajax resonse what is needed
}
答案 3 :(得分:0)
这是一个范围问题。
您需要在返回可访问的作用域中声明var res;
,并且只需在AJAX中更新该对象。
function sendRequest(link, type, query) {
var res;
$(document).ready(function(){
$.ajax({
//...
'success': function(data) {
res = data;
}
});
});
return res;
}
答案 4 :(得分:0)
AJAX是异步的(至少它应该是,我会避免使用async
设置为false
),因此结果将是未定义的。使用回调:
function sendRequest(link, type, query, callback) {
$.ajax({
..
..
'success': function(data) {
callback(data);
}
});
}
sendRequest(link, type, query, function(data) {
console.log(data); //YOUR DATA
});