Javascript 带承诺的方法链接
我想实现经典的方法链模式,最终的用法应该是Javascript 带承诺的方法链接,javascript,node.js,design-patterns,es6-promise,Javascript,Node.js,Design Patterns,Es6 Promise,我想实现经典的方法链模式,最终的用法应该是 DB .push(2) .push(3) 这是当前的代码,显然不起作用,我不清楚如何返回对DB本身的引用来解析承诺 let nodes = []; let DB = { self:this, push: (i) => new Promise((resolve, reject) => { nodes.push(i) resolve(this) }) } 只有类或函数实例具有此
DB
.push(2)
.push(3)
这是当前的代码,显然不起作用,我不清楚如何返回对DB本身的引用来解析承诺
let nodes = [];
let DB = {
self:this,
push: (i) => new Promise((resolve, reject) => {
nodes.push(i)
resolve(this)
})
}
只有
类
或函数
实例具有此
引用
classdb{
构造函数(){
this.nodes=[];
this.promise=promise.resolve();
}
推送(一){
这个.节点.推(i);
归还这个;
}
pushAsync(i){
返回新承诺((解决)=>{
这个.节点.推(i);
解决();
});
}
推送链(一){
这个。承诺。然后(()=>{
this.promise=新承诺((解决)=>{
这个.节点.推(i);
解决();
});
});
归还这个;
}
然后(回调){
这个。承诺。然后(回调);
}
}
const db=新的db();
推压(2)和推压(3);
然后(()=>db.pushAsync(5));
分贝
.推送链(6)
.推送链(7)
.then(()=>console.log(db.nodes));//或等待db的承诺;console.log(db.nodes)代码>真正的代码要复杂得多。你为什么说我不回你的承诺?另外,我想知道是否有一种方法(使用async/await)可以避免在类外使用then()
。为了保持像db这样的异步用法。push(2)。push(3)
async
只能消除函数内的,而不是函数外的。其他选项包括使用回调:db.push(2,db.push(3))
,传递数组:db.push([2,3])
,或者在调用者中使用wait:wait db.pushAsync(2);等待db.pushAsync(3)
。也许可以提供更多关于您的实际用例的细节,以及为什么上面的解决方案有问题?您的解决方案没有问题,只是不是一个真正的方法链。我将使用您的类
解决方案,感谢您想到了一种实现异步链接的方法。请参见编辑。不过,您仍然需要在调用方中处理链中的最终承诺。谢谢,您的示例甚至可以帮助我了解承诺的详细工作原理。