如何将ajax函数成功回调中计算的变量传递给document.ready?
我有这段代码
function loadActions()
{
var countDiv;
$.ajax({
type: "POST",
cache: false,
url:"modules/actions/actions.php",
success : function (data) {
$("#actions-container").html(data);
$('.action-details').hide();
countDiv = $('.action-tab-odd').length + $('.action-tab-even').length ;
}
});
return countDiv;
}
$(document).ready(function(){
var count = loadActions();
});
但是计数总是未定义的。我怎样才能让它发挥作用?
谢谢
答案 0 :(得分:2)
你不能 - $.ajax
是异步的。
这意味着即使您正在进行的通话需要很长时间,也会处理$.ajax
通话后的代码。
返回某些东西显然不是一件可以完成的事情。
然而,一旦完成了你的值,你就可以在success
中调用回调函数,这样它就会被处理掉。或者直接在success
方法中使用它。如果您需要直接使用数据,请不要使用$.ajax
并创建正确的代码服务器端。
答案 1 :(得分:1)
这是异步调用,ready的执行可以在调用success方法之前完成,所以创建一个新函数并将值从成功传递给该函数
success : function (data) {
$("#actions-container").html(data);
$('.action-details').hide();
countDiv = $('.action-tab-odd').length + $('.action-tab-even').length ;
MyCounting(countDiv);
}
function MyCounting(count)
{
}
答案 2 :(得分:1)
此代码是异步的,因此您会得到延迟的结果。与此同时,作业var count = ...
已经完成。您需要一个设置变量的回调函数。
试试这个:
var count;
loadActions(function(value){count = value});
和你的loadActions函数:
function loadActions(callback){
...
success : function (data) {
callback(countDiv);
请参阅 example here (我用超时替换了呼叫,但它实际上是相同的)
如果这不符合您的目的,您仍然可以将ajax请求切换为同步:
$.ajax({
async = false
});
答案 3 :(得分:0)
$.ajax
会对请求的网址进行异步调用,这意味着在调用成功回调函数之前,return countDiv;
行可能可能。
一种解决方案是通过添加async = false
选项使该网址调用同步:
$.ajax({
// ...
async = false,
// ...
});
如果这适合你,请不要忘记url调用不再是异步...
答案 4 :(得分:0)
尝试这样的事情:
function loadActions()
{
var countDiv;
//你想要考虑你要回来的东西 //下面,您将返回ajax对象作为函数结果。在您的示例中,您在一个不返回值的函数中返回一个超出范围的变量(您的成功函数不返回值) - >见下文。
return $.ajax({
type: "POST",
cache: false,
url:"modules/actions/actions.php",
success : function (data) {
$("#actions-container").html(data);
$('.action-details').hide();
return $('.action-tab-odd').length + $('.action-tab-even').length ;
},
error: function (){
return false;
}
});
}
//如果您不想检查ajax调用中的错误,可以省略错误调用,并且在成功语句返回之前,您可以包含检查$('。action)的条件-tab-odd')值设置正确 - 像:
if(typeof $('.action-tab-odd').length !== "undefined" || $('.action-tab-odd').length !== 0)
{
return false;
}
return $('.action-tab-odd').length + $('.action-tab-even').length
//然后在document.ready
上$(document).ready(function(){
if(loadActions()){
var count=loadActions();
console.log(count);
}
})
还有其他方法可以实现这一点,利用$ .Deferred(我自己也经常讨论这个问题),但这种方式似乎与你想要完成的工作最接近。