需要帮助!
我正在函数内执行ajax调用。 Ajax调用的结果是函数的返回值。
代码如下:
function tabstrip()
{
$.ajax({
type: "POST",
url: "/WebService/MessageUnratedCount.asmx/GetMessageUnratedCount",
data: "{}",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function(msg) {
nUnratedCount=msg.d;
}
});
return nUnratedCount;
}
在从Web服务的ajax调用获得结果后,应返回nUnratedCount值。但是它会在执行ajax调用之前返回。 你能帮忙吗?
答案 0 :(得分:8)
请记住,默认情况下,您的ajax请求不是同步调用,因此该函数将立即返回,而无需等待响应。我强烈建议的一个选项是使用asynch:false
设置。
最好的选择是重构代码的结构并传入一个将在成功时调用的回调
e.g
//calling code
tabstrip( yourCallbackFunction )
function tabstrip(callbackFn)
{
$.ajax({
type: "POST",
url: "/WebService/MessageUnratedCount.asmx/GetMessageUnratedCount",
data: "{}",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: callbackFn
});
}
function yourCallbackFunction (data){
//do something
}
答案 1 :(得分:0)
我认为默认情况下ajax调用是异步的。来自jquery docs:
async Boolean默认值:true 默认情况下,所有请求都是异步发送的(默认情况下设置为true)。如果需要同步请求,请将此选项设置为false。请注意,同步请求可能会暂时锁定浏览器,并在请求处于活动状态时禁用任何操作。
正如redsquare所指出的,重构可能比实际使用此选项更好。这取决于您当然的具体要求......
答案 2 :(得分:0)
由于请求是在异步模式下完成的(并且你真的不希望在同步模式下执行它,因为它在整个请求期间冻结了浏览器),你绝对拥有无法知道请求何时完成:
您使用
启动请求$.ajax({
...
});
// "here"
但是请求是在后台完成的,当你到达“here”时就没有完成。
为了能够处理Ajax请求的“返回值”,您必须在success
(或complete
或任何您想要的事件中插入的函数内完成所有工作。 )事件。
而不是仅仅将msg.d
放入nUnratedCount
,这个函数真的必须使用它(例如,在HTML文档中显示它,或者你愿意用它做什么)一块数据)
答案 3 :(得分:0)
Ajax调用是异步调用,执行调用但解释下一条指令而不等待返回调用。
您需要将“async”变量设置为“false”才能执行同步调用,因此代码会在等待调用结果时停止执行。
http://docs.jquery.com/Ajax/jQuery.ajax#options
尝试添加此内容:
function tabstrip()
{
$.ajax({
async: "false"
});
$.ajax({
type: "POST",
url: "/WebService/MessageUnratedCount.asmx/GetMessageUnratedCount",
data: "{}",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function(msg) {
nUnratedCount=msg.d;
}
});
$.ajax({
async: "true"
});
return nUnratedCount;
}