ajax请求中的变量丢失

时间:2017-09-19 13:27:34

标签: javascript jquery ajax

尝试将变量作为参数传递给嵌套的ajax请求回调时,我遇到了一种奇怪的行为:

$('form').on('submit',function(e){
    $.ajaxSetup({
        header:$('meta[name="_token"]').attr('content')
    })
    e.preventDefault(e);
    $.ajax({
        type:"POST",
        url:dest_url,
        data:$(this).serialize(),
        dataType: 'json',
        success: function(data){
            if($.isEmptyObject(data.error)){
                // performing some actions
                // at this point, data.id contains my id

                // We call an other function, 
                // which performs an other ajax request, 
                // with data.id as parameter

                listRefresh(data.id);

            }else{
                // error message
            }
        },
        error: function(data){
            // error message
        }
    })
});


function listRefresh(id){
    console.log(id); // At this point, id contains my id
    $.ajaxSetup({
        header:$('meta[name="_token"]').attr('content')
    })
    var src_url = location.href + '?id='+id;
    $.ajax({
        url: location.href,
        type: 'GET',
        cache: false
    })
    .done(function(id) {
        console.log(id); 

        // At this point the console outputs 
        // all my html code in place of id

        // I tried to pass data, response, id, but still the same issue
    })
    .fail(function() {
        //error message
    });
}

如上面的代码注释中所述,在listRefresh ajax完成回调中,我的变量似乎消失了,console.log在控制台中输出我的整个html代码... 我从来没有见过这样的东西。你有解释为什么,以及如何将我的id作为参数传递给ajax回调?

2 个答案:

答案 0 :(得分:3)

传递给done中函数的第一个参数是来自AJAX请求的响应。你调用变量并不重要,这就是传递给该函数的内容。

您可以捕获闭包中的值,只需给它另一个名称并将其分配给局部变量。像这样:

done(function(response) {
    var theId = id;

    // "response" contains the response from the server.
    // "theId" contains the value of `id` from outside this function.
})

答案 1 :(得分:2)

.done()方法的参数是AJAX调用的响应。如果您的调用返回了HTML页面,id变量会获得分配给它的所有html字符串。

要将id保存在其变量中,只需使用另一个,如:

.done(function(data) {
  console.log(data)
  console.log(id); 
});