【发布时间】:2015-12-15 19:37:33
【问题描述】:
我想从一个类中链接方法。我对同步方法有问题,但我不知道如何使用异步方法。
比如这个类:
class Example {
constructor() {
this.val = 0
}
async () {
setTimeout(() => {
this.val += 1
return this
}, 5000)
}
sync () {
this.val += 1
return this
}
check () {
console.log('checker', this.val)
return this
}
}
这行得通:
new Example().sync().check()
> 1
但这不起作用:
new Example().async().check()
> TypeError: Cannot read property 'check' of undefined
附:我想要链接,而不是地狱回调。
【问题讨论】:
-
首先,
async不是 ES6,而是 ES7 的提议。 -
您应该使用Promises,而不是试图转移
this引用。你仍然不会有那种语法(直到 ES7 中的 async/await 到达)但至少你可以避免回调地狱 -
顺便说一句,请阅读this 了解有关提供给
setTimeout的函数的执行上下文以及为什么return this不能像您希望的那样工作的一些信息。跨度> -
您需要在内部跟踪异步方法是否完成,并让
check监控它。顺便说一句,这与 ES6 或类无关(除了 promises 是 ES6,但它们在此之前也存在)。 -
如果你想链接异步操作(就像 jQuery 对动画所做的那样),那么你可以构建一个队列(或使用承诺),每个方法都可以存储到前一个异步操作完成并触发下一个操作以及您要使用的每个异步方法和同步方法都必须在完成后通知队列。
标签: javascript node.js class ecmascript-6 chaining