用回调理解javascript代码

时间:2010-12-22 18:32:39

标签: javascript node.js chat

下面你会看到twich.me node.js聊天服务器端代码的一部分:

exports.channel = function(MESSAGE_BACKLOG, MESSAGE_TRUNCATE) {
    return (function() {
        var messages  = [],
            callbacks = [];

        return {
            appendMessage : function (nick, room, type, text) {

  //truncate message if necessary
  if (type == 'msg' && text.length > MESSAGE_TRUNCATE) {
   text = text.substr(0, MESSAGE_TRUNCATE) + "... (trunc.)";
  }

  //message
  var m = {
   nick: nick,
   type: type, // "msg", "join", "part"
   text: text,
   room: room,
   timestamp: (new Date()).getTime()
  };

  //output to console
//  mlog(m);

  //push msg on message stack
  messages.push( m );

  //???
                while (callbacks.length > 0) {
                    callbacks.shift().callback([m]);
                }

  //old messages get pushed out of message stack
                while (messages.length > MESSAGE_BACKLOG) {
                    messages.shift();
                }
            },

            query : function (room, since, callback) {
                var matching = [];
                for (var i = 0; i < messages.length; i++) {
                    var message = messages[i];
                    if (message.timestamp > since && room == message.room) {
                        matching.push(message)
                    }
                }

    //???
                if (matching.length != 0) {
                    callback(matching);
                }
                else {
                    callbacks.push({ timestamp: new Date(), callback: callback });
                }
            },

     //run initially when script starts
            init : function() {
                // clear old callbacks older than 25 seconds (lowered from 30 seconds to get round rmit proxy server's 30sec timeout
                setInterval(function () {
                    var now = new Date();
                    while (callbacks.length > 0 && now - callbacks[0].timestamp > 25*1000) {
                        callbacks.shift().callback([]);
                    }
                }, 3000);
                return "hi";
            }
        }
    }());
}

该代码负责存储和检索来自其中一个聊天室的聊天消息。 我不是一个javascript程序员。我的背景是PHP,其中一切都是程序性的。我想用memcached来解决这个问题。但首先我需要了解究竟发生了什么。我添加了额外的评论。我不明白的是回调的所有内容。你能帮我理解回调的作用吗?

1 个答案:

答案 0 :(得分:1)

我真的不明白你想要什么,但这是正在发生的事情:

            while (callbacks.length > 0) {
                callbacks.shift().callback([m]);
            }

虽然数组回调中的对象数量大于0, callbacks.shift()函数显然会返回一个带有一个名为callback的属性的对象,这是一个函数。并且它正在调用具有变量m的数组的函数。

            if (matching.length != 0) {
                callback(matching);
            }
            else {
                callbacks.push({ timestamp: new Date(), callback: callback });
            }
        }

如果数组匹配中的对象数量不是0,则调用函数回调,如果是,则使用对象调用函数callback.push。