0

关于以下功能,我有两个问题。显然,这是关于聊天的。在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; 
    }); 
}

以下是我的问题:

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

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

4

2 回答 2

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!
});
于 2012-05-03T13:28:47.543 回答
1
  1. 很抱歉用问题回答问题,但是 和 的值是openconnection什么searchforcontact?看来他们不满足条件,所以你的 return 语句没有运行。您可以使用 FireBug 或 Chrome 开发人员工具验证该值。

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

于 2012-05-03T13:28:17.420 回答