我有一个javascript函数,它使用jQuery对Web服务进行JSON调用。 在success函数中,我需要评估JSON响应,如果需要,可以在同一个Web服务中再次调用另一个方法。
我是这样做的:
function firstAjaxCall(aid, tid) {
$.ajax({
type: "POST",
contentType: "application/json;charset=utf-8",
url: "/webservices/Webservice.asmx/Method1",
data: "{ auctionId: '" + aid + "'}",
dataType: "json",
success: function (response) {
var respData = response.d;
//do some stuff
if (respData.HasEnded == true) {
clearInterval(tid);
var end = false;
end = endFunction(aid);
if (end) {
// do some other stuff
}
}
},
failure: function (errorMsg) { alert(errorMsg.toString()); }
});
}
和从ajax成功函数中调用的endFunction:
function endFunction(aid) {
var hasEnded = false;
$.ajax({
type: "POST",
contentType: "application/json;charset=utf-8",
url: "/webservices/Webservice.asmx/Method2",
data: "{ auctionId: '" + aid + "'}",
dataType: "json",
success: function (callbackData) {
var endRespData = callbackData.d;
hasEnded = endRespData.Success;
alert(hasEnded.toString());
},
failure: function(XMLHttpRequest, textStatus, errorThrown) {
console.log(textStatus, errorThrown);
}
});
return hasEnded;
}
这是奇怪的东西。 ajax-call是可以的。服务器上的代码按计划运行。但是,如果我尝试在endFunction(aid)
的成功函数中设置一个firebug断点,则表示未点击,但会显示警告框,显示单词true。这有点好,因为我们似乎实际上已达到成功功能。但是,hasEnded
变量永远不会设置为true,因此它始终返回false。
从Firebug控制台调用endFunction(1)
会显示一个警告框,其中包含true
字样,并返回值false
。
出了什么问题?
答案 0 :(得分:2)
AJAX 异步 - $.ajax
调用不会等待服务器回复。
因此,return hasEnded;
行在AJAX回调之前运行。
您需要让endFunction
采用回调参数,例如$.ajax
。
答案 1 :(得分:0)
http://api.jquery.com/jQuery.ajax/ 看起来你在“错误”的文档中使用“失败”: 错误(XMLHttpRequest,textStatus,errorThrown) 你也应该这样做:
function firstAjaxCall(aid, tid) {
$.ajax({
type: "POST",
contentType: "application/json;charset=utf-8",
url: "/webservices/Webservice.asmx/Method1",
data: "{ auctionId: '" + aid + "'}",
dataType: "json",
success: function (response) {
var respData = response.d;
//do some stuff
if (respData.HasEnded == true) {
clearInterval(tid);
var end = false;
endFunction(aid,function(endv){
if (endv) {
// do some other stuff
}
});
}
},
error: function (errorMsg) { alert(errorMsg.toString()); }
});
}
function endFunction(aid,endcallback) {
var hasEnded = false;
$.ajax({
type: "POST",
contentType: "application/json;charset=utf-8",
url: "/webservices/Webservice.asmx/Method2",
data: "{ auctionId: '" + aid + "'}",
dataType: "json",
success: function (callbackData) {
var endRespData = callbackData.d;
hasEnded = endRespData.Success;
alert(hasEnded.toString());
endcallback(hasEnded);
},
error: function(XMLHttpRequest, textStatus, errorThrown) {
console.log(textStatus, errorThrown);
endcallback("?");
}
});
//return hasEnded;
}