又来提问了,callback工具??
发布于 10 年前 作者 sjfkai 6271 次预览 最后一次回复是 10 年前 来自 问答
看pomelo sample 源码
exp.playerLeave = function(args, cb) {
var areaId = args.areaId;
var playerId = args.playerId;
var player = area.getPlayer(playerId);
if (!player) {
utils.invokeCallback(cb);
return;
}
area.removePlayer(playerId);
area.getChannel().pushMessage({route: 'onUserLeave', code: consts.MESSAGE.RES, playerId: playerId});
utils.invokeCallback(cb); //问题1
};
utils
// callback util
utils.invokeCallback = function(cb) {
if (!!cb && typeof cb == 'function') {
cb.apply(null, Array.prototype.slice.call(arguments, 1));//问题2
}
};
问题1 :直接cb(null , obj)不好吗?
问题2:Array.prototype.slice.call(arguments, 1) 不就是 arguments.slice(1);吗?
11 回复
你的问题代码中已经回答了。
问题1,站在全局看,playerLeave 方法还在其他地方调用,有可能没有cb,invokeCallback 也可以变相理解为兼容,省去你写if(cb) cb(null)
arguments不是数组(arrya),是类数组(like-array),所以它没有原生数组拥有的slice方法,所以你需要借用原生数组的方法来slice
@dayuoba cb虽然只有一个参数,对应的是arguments[0] , 调用函数的时候可以多于一个参数,只能通过arguments使用, arguments有length属性 可是arguments为何不实现为Array呢?
@chapgaga pomelo中的一些js书写习惯?有一些地方我也不太清楚为什么那么写,比如源码中大量的使用
if(!!foo)这种强制类型转换,在我看来是没必要的,Array也是object,为什么arguments不是array object,我觉得是设计上的一些考虑。 @sjfkai 个人建议学pomelo还是多学习其架构设计比较好。 components,rpc等涨姿势啦,谢谢
请不要介意我叫你一声“js菜鸟”,这是很基础的知识
@qianjiahao 想问一下
Array.prototype.slice.call(arguments, 1)为什么不写成Array.slice.call(arguments, 1)呢?@20082496 因为slice是Array的原型对象上的方法,不是Array的方法,换句话说是要通过Array的实例来调用的
@20082496 可以
[].slice.call(arguments, 1)