Ajax以相同的逻辑返回不同的输出

时间:2013-02-08 15:55:44

标签: javascript jquery

我正在尝试下面的代码来通过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)时,它给我正确的答案   值,但当我试图返回它显示未定义。

任何人都可以帮我知道我哪里出错吗?

4 个答案:

答案 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;
}

这是同步的,它使用变量来存储内部函数的结果。