回调猛于多线程

写的js库提供了三个API——A、B、C,单独运行的时候好好的,但是当

API.A();
API.B();
API.C();

的时候,灾难就降临了。我对这个library的设计的本意是所有接口都是声明式(Declarative programming)的,但现在任意调换上面三句代码的顺序,行为竟然不一样了。更扯的是,就算是用同样是顺序调用,产生的行为也会不一样。听起来很像是多线程是吧?

问题出在——三个API可能会对同一个dom元素上的同一个event注册三个handler,而其中的某两个handler中有类似

dom.on("event", function(target, event){
	var that = this;
	if(ready){
		doSth();
	}
	else{
		$.get.then(function(){
			ready = true;
			that.trigger("event");
		});
	}
});

的代码,天下大乱!

回调/异步纠缠在了一起,产生了多线程一般时空错乱的效果。好在js毕竟是单线程,不存在race-condition那种真正”无解”的难题。重构了一下代码,多注册了几个custom-event,多写了几个状态变量,虽然代码变得复杂无比,但好在问题还是解决了。

Callbacks as our Generations’ Go To Statement,感觉第二次引用这个链接了。

###update

第二天思路又清晰了点,感觉更好的实现方式应该是无论API.A()还是API.C()都应该只是enable some flags,然后event handler始终有且只有一个:

dom.on("event", function(target, event){
	if(config.needToCallA)
		_A();
	if(config.needToCallB)
		_B();
	if(config.needToCallC)
		_B();
});

虽然可能这一个handler的逻辑会很重(extract to method AKA: ctrl+R ctrl+M),但是至少是清晰的。