我有这个JS功能:
function ax_get_new_msg_cnt()
{ var mTimer;
var last_msg_id;
mTimer = setTimeout('ax_get_new_msg_cnt();',30000);
$.getJSON('/apps_dev.php/profile/newMessageCheck', function(data)
{
$('#newMessageDiv').text("You have " + data.msg_cnt + " new ");
last_msg_id = data.msg_id;
});
return last_msg_id;
}
然后我有js函数,我调用ax_get_new_msg_cnt()
:
function ax_get_new_msg_details()
{
var mTimer;
mTimer = setTimeout('ax_get_new_msg_details();',30000);
$.getJSON('/apps_dev.php/messagebox/newMessageDetails', function(data)
{
var str='<tr>';
str += "<td class='td_show_contact_item' align='left' id='td_date'>"+data.td_date+'</td>';
str += "<td align='left' id='td_subject'><a href='#' style='color:#ff0000 !important' class='spn_small_red_rbc'>"+data.td_subject+"</a></td>";
str += "<td class='td_show_contact_item' align='left' id='td_from'>"+data.td_from +"</td>";
//str += "<td id='block_url'>"+data.block_url+"</td>";
str +='<tr>';
var tbl = $('#td_date').parents('table');
var msg_id = ax_get_new_msg_cnt();
console.log(msg_id);
if (msg_id == data.td_id)
{
}
else
{
$(tbl).append(str);
}
});
}
在上面的函数中我将msg_id
视为未定义...
我可以按照我的方式去做,还是有另外一种方式可以吗?
只有当msg_id != data.td_id
我想要追加
时
谢谢
答案 0 :(得分:1)
您需要了解异步编程方式。
在您的第一个方法中,当它被调用时,它会向网络服务器启动异步JSON请求,该请求会在稍后时间返回,但您的$.getJSON
调用会立即返回,因此您的last_msg_id
变量将是未触及的undefined
函数将返回此未触及的ax_get_new_msg_cnt
)变量。
稍后当网络服务器返回答案并且浏览器读取答案时,它会返回到设置last_msg_id
的回调函数。
您可以编写console.log
调试消息以查看时间:
console.log('JSON start');
来电之前在ax_get_new_msg_details
方法中插入$.getJSON
console.log('Response arrived');
部分内的function(data)
一个console.log('JSON request sent');
然后,你可能会看到执行的方式。
答案 1 :(得分:0)
你想用msg_id做什么,你需要在$ .getJSON回调函数中做到这一点。你不能退货。 Ajax调用是asyncron,所以你必须等到它完成才能获得值。
答案 2 :(得分:0)
由于$.getJSON()方法是异步的,因此您的ax_get_new_msg_cnt()
函数会在收到数据之前返回,并将last_msg_id
保留为undefined
。
此外,我认为$.getJSON()
的URL参数应指向文件,而不是文件夹。
注意:您可以使用$.ajaxSetup方法为所有jQuery ajax请求设置默认超时来改进代码。