可以在它之外使用ajax响应吗?

时间:2012-05-18 12:44:01

标签: javascript jquery ajax post global-variables

如何使用data_response之外的$.post()

这是我使用的代码的一部分:

$.post('do.php', { OP: "news_search", category: cat_id },
    function(data_response){
        var response = data_response; //I need to access this variable outside of $.post()
    }
}, "json");

console.log(response); //response is not defined, is what I get for now

更新

是否无法在全球范围内获得该响应?

5 个答案:

答案 0 :(得分:2)

没有; $.post以异步方式执行,因此当您调用console.log时,AJAX请求仍在运行,尚未产生响应。这是回调函数的目的:在请求完成后提供要运行的代码。如果将console.log移动到回调函数中,它应该可以工作:

$.post('do.php', { OP: "news_search", category: cat_id },
    function(data_response){
        var response = data_response; //I need to access this variable outside of $.post()
        console.log(response);
    }
}, "json");

更新:如果您希望响应数据全局可用,您可以在全局范围内声明变量,如下所示:

var response = null;
$.post('do.php', { OP: "news_search", category: cat_id },
    function(data_response){
        response = data_response;
        console.log(response);
    }
}, "json");

当然,您可以确定response的唯一背景 实际上已经填充了一个值是在提供的回调函数中 第$.post行之后的response = data_response;。如果你想在它使用它 在脚本中的任何其他阶段,您将必须首先检查其值; 像这样的东西:

if (response !== null)
{
    console.log(response);
}

请注意,如果您直接说完,此代码将不会执行任何操作 $.post电话;只有在POST请求完成后执行,在其他一些异步回调(可能是某种类型的UI交互事件)中才会有用。

答案 1 :(得分:1)

只需在回调之外声明变量,使其范围限定为您可以从以下位置获取的代码的一部分:

var response;

$.post('do.php', { OP: "news_search", category: cat_id },
    function(data_response){
    response = data_response; 
    }
}, "json");

console.log(response); //response is now defined - It won't be populated yet though.

正如上面的代码中所指出的,虽然将定义响应,但是在调用console.log时不会填充它,但是如果在回调触发后的某个时刻访问变量,它将是填充。

如果沿着这条路走下去,你可能想要使用模块模式或闭包来避免将响应变量放在全局范围内(你可能想要公平地做到这一点)

Crockford的模块模式:http://www.yuiblog.com/blog/2007/06/12/module-pattern/

答案 2 :(得分:1)

你可以使用一个变量,并在脚本的任何地方检查done(),如果已经完成,它将立即执行,否则它将在ajax调用完成后执行。

var XHR = $.post('do.php', { OP: "news_search", category: cat_id },
    function(data_response){
        // do somehing with data_response
    }
}, "json");


function doSomethingElse() {
    XHR.done(function(response) {
        console.log(response);
    });
}

答案 3 :(得分:0)

如果您需要在$ .post()之外使用响应,并且您需要确保在$ .post()调用之后立即填充此值,您可以尝试在同步中进行“POST”调用方式。这不能用$ .post()进行,但可以使用$ .ajax():

var returnedData = null;

$.ajax({
  type: 'POST',
  url: 'do.php', 
  data: { OP: "news_search", category: cat_id },
  success: function (response) {
            returnedData = response;
        },
  dataType: "text"
});

console.log(returnedData );

答案 4 :(得分:0)

我得到了这样的工作:

var returnedData = {}; //Declaring Object var not just var
$.ajax({
type: 'POST',
url: 'do.php',
data: { OP: "news_search", category: cat_id },
success: function (response) {
returnedData.result1=response;  //Add response into the Object created outside the ajax
},
dataType: "json"
});
console.log(returnedData);//inside it you can get returnedData.result1