Pomelo杂记(三)

1、bind()绑定参数表
-------------------------------------
在chatofpomelo例子中,chatofpomelo\game-server\app\servers\connector\handler\entryHandler.js有这么一段

session.on('closed', onUserLeave.bind(null, self.app));
var onUserLeave = function(app, session) {
    if(!session || !session.uid)
    {
        return;
    }
    app.rpc.chat.chatRemote.kick(session, session.uid, app.get('serverId'), session.get('rid'), null);
};

这个bind()方法是ES 5 新增的一个特性。主要用于将函数绑定到某个对象上。

这里主要用到了bind()绑定参数表的功能,他的第一个参数一般是要绑定的对象,这里没有对象可绑所以为null,简单而言通过bind(null, this.app)之后,onUserLeave方法只要传递session参数即可。

-------------------------------------

2、检查与调用回调函数
-------------------------------------

在lordofpomelo例子中,lordofpomelo\game-server\app\util\utils.js这个脚本有这么一个函数,它的作用主要是检查与调用回调函数。

utils.invokeCallback = function(cb) {
if(!!cb && typeof cb === 'function') {
cb.apply(null, Array.prototype.slice.call(arguments, 1));
}
};

分析:
arguments是包含这个函数参数的数组对象,借用Array数组的slice方法,分割数组,获取arguments第1位往后的参数,作为一个新数组,传递给对象cb的方法,apply第一个参数null原本其实是传的类对象的指针this,只不过这里回调函数是没哟哟指针的,所以传null

使用:
utils.invokeCallback(cb, {code: err.number, msg: err.message}, null);
这里, {code: err.number, msg: err.message}, null将被传递给cb 的第一个和第二个参数,所以,invokeCallback的参数理论上是依据cb的参数的个数来传递的。

例子:
utils.invokeCallback(cb, ' user not exist ', null);

数据:
直接console.log(arguments)打印:{ '0': [Function], '1': ' user not exist ', '2': null }
console.log(Array.prototype.slice.call(arguments, 1))打印:[ ' user not exist ', null ]

结果:' user not exist ', null被传递给cb

-------------------------------------


你可能感兴趣的:(pomelo)