我正在尝试下面的代码来通过AJAX返回一个数组并尝试提醒返回值,但是在使用相同的逻辑获取正确的值时它显示未定义。
这是我的HTML& JS代码:
HTML
<body>
<div>
<input type="button" id="getMI" />
</div>
</body>
JS代码(未定义)
var getId = function () {
$.ajax({
type: 'GET',
url: url,
dataType: 'json',
contentType: "application/json",
success: function (res) {
objLen = res.length;
var arrElems = [];
for (i = 0; i < objLen; i++) {
arrElems[i] = res[i].ids;
}
return arrElems;
},
error: function (e) {
return e;
}
})
}
JS代码(获取正确的值)
var getId = function(){
var nums = [];
for(i=0;i<5;i++)
{
nums[i] = i+1;
}
return nums;
}
警报值
$('#getMI').click(function(){
var ids = getId();
alert(ids)
})
当我直接警告输出(block_faces)时,它给我正确的答案 值,但当我试图返回它显示未定义。
任何人都可以帮我知道我哪里出错吗?
答案 0 :(得分:0)
您无法从ajax回调中返回。首先,它没有任何地方可以将返回到。其次,除非它是同步的(不要这样做),否则在 ajax调用之后的代码可能会先执行,而你无法获得所需的值。
您必须使用成功回调来处理所有post-ajax操作,或者您可以将更多回调绑定到通过.done
返回的jqXHR对象:
var getBlockFaceId = function(){
return $.ajax({
$("#getBFI").on('click', function () {
getBlockFaceId().done(function () { alert(ids); });
});
答案 1 :(得分:0)
return关键字返回触发返回的当前函数的值。因此,您当前正在编写的返回值将返回成功函数的值。 因此,为js定义一个全局变量并更新该值,如下所示
var block_faces = '';
$.ajax({
type:'GET',
url:url,
dataType:'json',
contentType: "application/json",
success:function(res){
objLen = res.length;
var block_faces = [];
for(i=0;i<objLen;i++)
{
block_faces[i] = res[i].block_face_id;
}
},
error:function(e){
block_faces = e;
}
})
答案 2 :(得分:0)
伙计们我想分享一下我对解决问题的了解。为了成功拨打电话,我使用了 async:false 之后的建议,但后来我遇到了一些问题。我在Safar浏览器上无法获得成功响应这样的问题。在这里发布问题后,我发现使用 async:false 是完全错误的方法。
我在这里粘贴评论和讨论的链接。
Getting error in AJAX response on Safari browser only
希望它会帮助你们。感谢。
答案 3 :(得分:-1)
该功能在ajax完成之前完成。 因此“异步”。
您可以在jQuery中使用该选项关闭异步。 http://api.jquery.com/jQuery.ajax/
之前曾问过这个问题。
编辑: 将它与其他答案组合时,这也是正确的。
var getBlockFaceId = function () {
var result;
$.ajax({
type: 'GET',
url: url,
dataType: 'json',
async: false,
contentType: "application/json",
success: function (res) {
objLen = res.length;
var block_faces = [];
for (i = 0; i < objLen; i++) {
block_faces[i] = res[i].block_face_id;
}
result = block_faces;
},
error: function (e) {
result = e;
}
});
return result;
}
这是同步的,它使用变量来存储内部函数的结果。