如何基于Promise实现DB对象的方法链调用模式?
解决方法链模式结合Promise的问题
首先看你当前代码的两个核心问题:
- 箭头函数的
this指向错误:你用箭头函数定义push方法,箭头函数没有自己的this,它会继承外层作用域的this(全局环境下就是window/global),所以resolve(this)返回的根本不是DB对象,而是全局对象。 - 链式调用的逻辑矛盾:就算你正确返回了
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
相关产品推荐
相关产品推荐

