2011-09-28 86 views
0

我有这个JS功能:js函数调用另一个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函数,其中i调用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

Eval是邪恶的!在'setTimeout'或'setInterval'调用中使用字符串作为第一个参数会创建对'eval'的隐式(和不必要的)调用。而不是'setTimeout('ax_get_new_msg_cnt();',30000);'只传递函数名:'setTimeout(ax_get_new_msg_cnt,30000);'。更少的代码和更少的计算时间。同样的事情适用于'ax_get_new_msg_details'中的'setTimeout'调用。 –

+0

哎呀,甚至没有看到!谢谢! –

回答

1

您需要了解异步编程方式。

在你的第一种方法,当它被调用时,启动一个异步JSON请求到Web服务器,这将在时间后回来,但你$.getJSON调用立即返回,这样你的last_msg_id变量将被改动,这不变(undefined)变量将由ax_get_new_msg_cnt函数返回。

之后当网络服务器返回答案并且答案被您的浏览器读取时,它会回传给您的回调函数,该函数设置last_msg_id

你可以写console.log调试消息看时机:

  1. 如果你$.getJSON呼叫
  2. 然后一个console.log('Response arrived');function(data)部分内
  3. 和前插入console.log('JSON start');ax_get_new_msg_details方法另一个在console.log('JSON request sent');之前

然后,你可能会看到执行的方式。

+0

谢谢你,我明白了 –

0

你想和你需要做的是在$ .getJSON回调函数MSG_ID做什么都。你不能退还。 Ajax调用是异步的,所以你必须等到它完成才能获得值。

0

因为$.getJSON()方法是异步的,你ax_get_new_msg_cnt()函数将返回被接收的数据之前,留下last_msg_idundefined

此外,我认为$.getJSON()的URL参数应该指向一个文件,而不是文件夹。

注意:您可以通过使用$.ajaxSetup方法来设置所有的jQuery Ajax请求一个默认的超时时间改善你的代码。