js函数调用另一个js函数并返回值问题

时间:2011-09-28 09:02:03

标签: javascript json

我有这个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我想要追加
时 谢谢

3 个答案:

答案 0 :(得分:1)

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

在您的第一个方法中,当它被调用时,它会向网络服务器启动异步JSON请求,该请求会在稍后时间返回,但您的$.getJSON调用会立即返回,因此您的last_msg_id变量将是未触及的undefined函数将返回此未触及的ax_get_new_msg_cnt)变量。

稍后当网络服务器返回答案并且浏览器读取答案时,它会返回到设置last_msg_id的回调函数。

您可以编写console.log调试消息以查看时间:

  1. 如果您在console.log('JSON start');来电之前在ax_get_new_msg_details方法中插入$.getJSON
  2. 然后console.log('Response arrived');部分内的function(data)一个
  3. 和另一个在console.log('JSON request sent');
  4. 结束之前

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

答案 1 :(得分:0)

你想用msg_id做什么,你需要在$ .getJSON回调函数中做到这一点。你不能退货。 Ajax调用是asyncron,所以你必须等到它完成才能获得值。

答案 2 :(得分:0)

由于$.getJSON()方法是异步的,因此您的ax_get_new_msg_cnt()函数会在收到数据之前返回,并将last_msg_id保留为undefined

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

注意:您可以使用$.ajaxSetup方法为所有jQuery ajax请求设置默认超时来改进代码。