CNode

又来提问了,callback工具??

问答
Ssjfkai发布于11 年前最后回复11 年前11 回复6481 浏览0 收藏

看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)

X
xiuxu123#1·11 年前

你的问题代码中已经回答了。

H
haozxuan#2·11 年前

问题1,站在全局看,playerLeave 方法还在其他地方调用,有可能没有cb,invokeCallback 也可以变相理解为兼容,省去你写if(cb) cb(null)

D
dayuoba#3·11 年前
  • 加了一层验证
  • arguments不是数组对象,是类数组对象。没有slice方法
Q
qianjiahao#4·11 年前

arguments不是数组(arrya),是类数组(like-array),所以它没有原生数组拥有的slice方法,所以你需要借用原生数组的方法来slice

C
chapgaga#5·11 年前
引用 dayuoba加了一层验证 arguments不是数组对象,是类数组对象。没有slice方法

@dayuoba cb虽然只有一个参数,对应的是arguments[0] , 调用函数的时候可以多于一个参数,只能通过arguments使用, arguments有length属性 可是arguments为何不实现为Array呢?

D
dayuoba#6·11 年前
引用 chapgaga@dayuoba cb虽然只有一个参数,对应的是arguments[0] , 调用函数的时候可以多于一个参数,只能通过arguments使用, arguments有length属性 可是arg...

@chapgaga pomelo中的一些js书写习惯?有一些地方我也不太清楚为什么那么写,比如源码中大量的使用if(!!foo)这种强制类型转换,在我看来是没必要的,Array也是object,为什么arguments不是array object,我觉得是设计上的一些考虑。 @sjfkai 个人建议学pomelo还是多学习其架构设计比较好。 components,rpc等

S
sjfkai#7·11 年前

涨姿势啦,谢谢 untitled1.png

H
hoozi#8·11 年前

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

2
20082496#9·11 年前
引用 qianjiahaoarguments不是数组(arrya),是类数组(like array),所以它没有原生数组拥有的slice方法,所以你需要借用原生数组的方法来slice

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

Q
qianjiahao#10·11 年前
引用 20082496@qianjiahao 想问一下Array.prototype.slice.call(arguments, 1)为什么不写成Array.slice.call(arguments, 1)呢?

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

参与回复
登录后即可参与回复。登录