Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 带承诺的方法链接_Javascript_Node.js_Design Patterns_Es6 Promise - Fatal编程技术网

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)
。也许可以提供更多关于您的实际用例的细节,以及为什么上面的解决方案有问题?您的解决方案没有问题,只是不是一个真正的方法链。我将使用您的
解决方案,感谢您想到了一种实现异步链接的方法。请参见编辑。不过,您仍然需要在调用方中处理链中的最终承诺。谢谢,您的示例甚至可以帮助我了解承诺的详细工作原理。