又来提问了,callback工具??
发布于 9 年前 作者 sjfkai 5263 次浏览 最后一次编辑是 8 年前 来自 问答

看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不是数组对象,是类数组对象。没有slice方法

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等

涨姿势啦,谢谢 untitled1.png

请不要介意我叫你一声“js菜鸟”,这是很基础的知识

@qianjiahao 想问一下Array.prototype.slice.call(arguments, 1)为什么不写成Array.slice.call(arguments, 1)呢?

@20082496 因为slice是Array的原型对象上的方法,不是Array的方法,换句话说是要通过Array的实例来调用的

@20082496 可以[].slice.call(arguments, 1)

回到顶部