关于JavaScript函数的两个问题

时间:2012-05-03 13:16:33

标签: javascript return settimeout

关于以下功能我有两个问题。显然,这是关于聊天。在函数chat()中,调用不同的函数,一个用于建立连接,一个用于搜索某人(随机)聊天,另一个用于每秒获取消息。

function chat()
{
    //Open connection
    var openconnection=openConnection();
    //Stop function if connection could not be established
    if(openconnection==false) return;

    //Search for someone to chat with
    searchforcontact=searchForContact();
    if(searchforcontact==false) return;

    //Constantly get messages
    setTimeout(function(){
        setInterval(getMessages(),1000);
    },2000);
}

function openConnection() { 
    //Establish connection to php script 
    $.ajax({ 
        type: 'POST', 
        url: 'action/chat/openconnection.php', 
        success: function(connection) { 
            //Let user know that someone to chat with is searched for 
            $('#chatTextDiv').append('bla'); 
            //Return that the connection was successfull 
            return true; 
        } 
    }).error(function() { 
        //Let user know that a connection could not be established 
        $('#chatTextDiv').append('bla'); 
        //Return false 
        return false; 
    }); 
}

以下是我的问题:

1:如果无法建立连接,我使用return来停止函数chat()。然而,这些功能继续searchForContact(),即使失败,仍然会继续。怎么样?

2:函数getMessages()只运行一次,我想知道为什么?仅供参考,我使用超时来实现可用性。

2 个答案:

答案 0 :(得分:3)

很可能openConnection()不会返回false。由于同步API非常罕见且在JavaScript中无法实现,我很确定openConnection不能像您使用它一样工作。请提供有关openConnection功能的更多信息。

此外,您不是将getMessages函数传递给对setInterval的调用,而是调用getMessages并将其返回的任何内容传递给setInterval。这很可能不是你想要的。您应该将该调用更改为以下内容:

setTimeout(function(){
    setInterval(getMessages,1000);
},2000);

您应该真正了解AJAX和异步API的工作原理。为了让您从头到尾,您的代码更新应该能够证明您的错误:

function openConnection(success, error) { 
    //Establish connection to php script 
    $.ajax({ 
        type: 'POST', 
        url: 'action/chat/openconnection.php', 
        success: success
    }).error(error||function () {}); 
}

function chat(ready) {
    //Open connection
    openConnection(function () {
        // If this function is called, then the connection is established

        //Search for someone to chat with
        searchforcontact=searchForContact();
        if(searchforcontact==false) return;

        // I STRONGLY SUPPOSE searchForContact is also an asynchronous API!

        //Constantly get messages
        setTimeout(function(){
            setInterval(getMessages,1000);
            ready();
        },2000);
    }, function () {
        // when this function is called, something went wrong.
    });
}

chat(function () {
    // when this function is called, chat is ready to be used!
});

答案 1 :(得分:1)

  1. 很抱歉回答有问题的问题,但openconnectionsearchforcontact的价值是多少?看来他们不满足条件,所以你的return语句没有运行。您可以使用FireBug或Chrome开发者工具验证该值。

  2. getMessages只运行一次,因为您调用它而不是将其传递给setInterval。它应该是setInterval(getMessages, 1000);