You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于Promise实现DB对象的方法链调用模式?

解决方法链模式结合Promise的问题

首先看你当前代码的两个核心问题:

  1. 箭头函数的this指向错误:你用箭头函数定义push方法,箭头函数没有自己的this,它会继承外层作用域的this(全局环境下就是window/global),所以resolve(this)返回的根本不是DB对象,而是全局对象。
  2. 链式调用的逻辑矛盾:就算你正确返回了DB,push方法返回的是Promise实例,而Promise本身没有push方法,直接写DB.push(2).push(3)肯定会报错,因为第二个push是在Promise上调用的,不存在这个方法。

下面给你两种针对性的解决方案,你可以根据需求选择:


方案1:修正this指向,使用标准Promise链式调用

把push改成普通函数(不要用箭头函数),让this正确指向DB,然后通过then回调来实现链式调用:

let nodes = [];
let DB = {
  push: function(i) {
    return new Promise((resolve, reject) => {
      nodes.push(i);
      // 这里可以加入真实的异步操作,比如模拟DB写入延迟
      // setTimeout(() => resolve(this), 100);
      resolve(this); // 现在this指向DB对象
    });
  }
};

// 使用示例
DB.push(2)
  .then(db => db.push(3))
  .then(() => console.log(nodes)); // 输出 [2, 3]

这种方式完全符合Promise的标准用法,每个push返回的Promise会resolve为DB自身,你可以在then回调里继续调用后续方法。


方案2:实现无需then的流畅链式调用

如果你想完全实现DB.push(2).push(3)这种写法,可以维护一个内部的任务队列,让每个push操作自动排队执行,同时返回DB自身:

let nodes = [];
let DB = (() => {
  // 初始化一个已完成的Promise作为任务队列起点
  let taskQueue = Promise.resolve();

  return {
    push(i) {
      // 将当前任务加入队列,等待前一个任务完成后执行
      taskQueue = taskQueue.then(() => {
        nodes.push(i);
        // 模拟异步DB操作,比如真实的写入延迟
        return new Promise(resolve => setTimeout(resolve, 100));
      });
      // 返回DB自身,支持链式调用
      return this;
    },
    // 可选:添加一个方法监听所有任务完成
    onComplete(callback) {
      taskQueue.then(callback);
      return this;
    }
  };
})();

// 使用示例
DB.push(2).push(3).onComplete(() => {
  console.log(nodes); // 所有任务完成后输出 [2, 3]
});

这种方式下,链式调用的写法和你期望的完全一致,内部会自动按顺序执行异步任务,最后可以通过onComplete来处理所有操作完成后的逻辑。

内容的提问来源于stack exchange,提问作者alfredopacino

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:44:30