希望达到的调用方式如下
login.verify().pass(function(){ alert('通过了') }).fail(function(){ '没通过' });
首先在verify()中经过认证,如果通过了执行pass(),如果没通过,执行fail()。
这里是一个模板。
var login = {
verify: function() {
// 这里的代码如何写?
return this;
},
pass: function(fn) {
fn();
},
fail: function(fn) {
fn();
}
};
想了个办法,不知道有没有更好的实现方式。
coffeescript
login =
verify: ->
@result = true
return @
pass: (fn) ->
if @result then fn()
return @
fail: (fn) ->
unless @result then fn()
javascript
var login;
login = {
verify: function() {
this.result = true;
return this;
},
pass: function(fn) {
if (this.result) {
fn();
}
return this;
},
fail: function(fn) {
if (!this.result) {
return fn();
}
}
};
试试Promsie。还有为什么要写成这么难看的代码?
@ngot 如果不用promise,应该怎么写?
链式调用的接口不是这么设计滴,就Promise不好吗
login.verify().then (passed) ->
message = if passed then '通过了' else '没通过'
alert message
@think2011 我来替楼上回答:fibjs
@ravenwang 谢谢,我去研究下。
@ravenwang 其实,这句,我忍住,没说。
这样吧,把 login 设计成一个类:
Login.prototype.verify;
Login.prototype.pass;
Login.prototype.fail;
然后继承自 EventEmitter
。
在这三个函数里面最后都要 return this
。
Login.prototype.verify = function() {
if(验证成功) this.emit("succ");
if(失败) this.emit("fail");
return this;
};
然后另外两个函数所要做的事情实际上就是:
Login.prototype.pass = function(cb) {
this.on("succ", cb);
return this;
}
这样就能完成你所说的链式调用了。
@XadillaX 当然也可以不用继承,直接在 Login 的构造函数里面加一个 this.emitter = new EventEmitter()
,然后其他函数里面就是 this.emitter.[emit|on]
了。
@XadillaX 恩,这个办法很合适! 可是只有 node.js才有 EventEmitter类的吧?
这个链式调用接口设计本身是有问题的,接口之间通常应该是独立不相互依赖的,这个接口设计中pass
和fail
需要依赖verify
,况且一个if...else
就能解决的问题干嘛要搞个链式调用
@ravenwang 我有一个需求是这样的,拿商城作例子吧。 正常情况下用户去浏览商品,当要下单,或者浏览自己的订单的时候,才需要登录。 所以接口打算这样设计。 根据verify()来确定是弹出登陆框(fail)还是进入对应功能(pass)。
请问,就以上的需求,有更好的设计逻辑吗?
login.verify(function (passed) {
if (passed) {
onPass();
} else {
onFail();
}
});
/////
login.verify(
function onPass() {
},
function onFail() {
}
);