请问这种队列形式的链接调用在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(); } };


7 回复

要实现你提到的这种链式调用的方式,并且在 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('没通过');
    });
  });

解释

  1. verify 方法:

    • 我们创建了一个返回 Promise 的 verify 方法。
    • 在 Promise 中,我们模拟了一个异步认证过程(使用 setTimeout)。
    • 如果认证成功,我们调用 resolve(),否则调用 reject()
  2. 链式调用:

    • login.verify() 返回一个 Promise 对象。
    • .then() 用于处理认证成功的回调函数。
    • .catch() 用于处理认证失败的回调函数。
  3. passfail 方法:

    • 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();
    }
  }
};

试试Promsie。还有为什么要写成这么难看的代码?

链式调用的接口不是这么设计滴,就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;
}

这样就能完成你所说的链式调用了。

这个链式调用接口设计本身是有问题的,接口之间通常应该是独立不相互依赖的,这个接口设计中passfail需要依赖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()。这将稍微改变方法名以匹配你的需求,但核心逻辑保持不变。

回到顶部