请问这种队列形式的链接调用在Nodejs中如何实现?
请问这种队列形式的链接调用在Nodejs中如何实现?
希望达到的调用方式如下
login.verify().pass(function(){ alert('通过了') }).fail(function(){ '没通过' });
首先在verify()中经过认证,如果通过了执行pass(),如果没通过,执行fail()。
这里是一个模板。
var login = {
verify: function() {
// 这里的代码如何写?
return this;
},
pass: function(fn) {
fn();
},
fail: function(fn) {
fn();
}
};
要实现你提到的这种链式调用的方式,并且在 verify()
方法中进行认证处理,可以使用 Node.js 中的异步操作。我们可以利用 Promise 或者 async/await 来处理异步操作。以下是一个使用 Promise 的示例代码:
示例代码
var login = {
verify: function() {
return new Promise((resolve, reject) => {
// 模拟一个异步认证过程
setTimeout(() => {
const isAuthenticated = true; // 假设用户已经认证通过
if (isAuthenticated) {
resolve();
} else {
reject();
}
}, 1000);
});
},
pass: function(fn) {
fn();
},
fail: function(fn) {
fn();
}
};
// 使用链式调用的方式
login.verify()
.then(() => {
login.pass(() => {
console.log('通过了');
});
})
.catch(() => {
login.fail(() => {
console.log('没通过');
});
});
解释
-
verify
方法:- 我们创建了一个返回 Promise 的
verify
方法。 - 在 Promise 中,我们模拟了一个异步认证过程(使用
setTimeout
)。 - 如果认证成功,我们调用
resolve()
,否则调用reject()
。
- 我们创建了一个返回 Promise 的
-
链式调用:
login.verify()
返回一个 Promise 对象。.then()
用于处理认证成功的回调函数。.catch()
用于处理认证失败的回调函数。
-
pass
和fail
方法:pass
方法接收一个函数作为参数,并立即执行该函数。fail
方法也接收一个函数作为参数,并立即执行该函数。
这种方式使得代码更加清晰和模块化,同时支持链式调用。你可以根据实际需求修改 verify
方法中的逻辑来适应不同的认证场景。
想了个办法,不知道有没有更好的实现方式。
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();
}
}
};
链式调用的接口不是这么设计滴,就Promise不好吗
login.verify().then (passed) ->
message = if passed then '通过了' else '没通过'
alert message
这样吧,把 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;
}
这样就能完成你所说的链式调用了。
这个链式调用接口设计本身是有问题的,接口之间通常应该是独立不相互依赖的,这个接口设计中pass
和fail
需要依赖verify
,况且一个if...else
就能解决的问题干嘛要搞个链式调用
为了实现你描述的链式调用形式,我们可以利用Node.js中的Promise来处理异步操作,并且让方法返回一个对象,该对象包含.pass()
和.fail()
方法。以下是具体的实现代码:
var login = {
verify: function() {
return new Promise((resolve, reject) => {
// 假设这里有一个异步操作(例如API调用)
setTimeout(() => {
const isValid = true; // 这里可以根据实际逻辑判断是否验证成功
if (isValid) {
resolve();
} else {
reject();
}
}, 1000);
});
},
then: function(onFulfilled, onRejected) {
this.verify()
.then(onFulfilled)
.catch(onRejected);
return this; // 返回当前对象以支持链式调用
}
};
// 使用方式
login.then(
() => console.log('通过了'),
() => console.log('没通过')
);
在这个例子中,verify()
方法返回一个Promise对象,根据验证的结果来决定是调用.then()
的onFulfilled
回调函数还是onRejected
回调函数。这样就实现了链式调用的形式。
如果你想要更接近于你提供的原始模板,可以将.then()
重命名为.pass()
和.fail()
。这将稍微改变方法名以匹配你的需求,但核心逻辑保持不变。