【发布时间】:2016-09-30 01:51:44
【问题描述】:
ES6 Classes 作为一种组织模式可以为异步代码提供什么。下面是一个 ES7 async/await 的例子,一个 ES6 类可以有一个异步方法,或者 ES7 中的构造函数吗?
我能做到吗:
class Foo {
async constructor() {
let res = await getHTML();
this.res = res
}
}
如果不是,构造函数应该如何工作?
class Foo {
constructor() {
getHTML().then( function (res) {
this.res = res
}
}
}
如果这些模式都不起作用,ES6 class 中的构造函数(以及类)是否可以支持任何形式的对对象状态进行操作的异步?或者,它们是否仅适用于纯同步代码库?上面的例子在构造函数中,但它们不需要......将问题推低一层......
class Foo {
myMethod () {
/* Can I do anything async here */
}
}
或者,使用吸气剂...
class Foo {
get myProp() {
/* Is there any case that this is usefully asynchronous */
}
}
我能想到的唯一示例是在同一个方法/构造函数/getter 中并行运行某些东西,但要在得出结论之前解决整个问题。我只是感到困惑,因为似乎对完全异步库的所有推动,这只会使事情变得混乱。除了教科书的例子,我找不到它们有用的应用程序。
【问题讨论】:
-
你可以从构造函数返回一个用实例解析的promise,从而在实例初始化后让你访问它。
-
@KevinB 我确实想到了这个想法,但听起来很可怕。
-
我也不是特别喜欢,但是……还有什么办法呢?某处必须有一个回调,它要么是一个承诺,要么是一个作为参数传递的回调。 async/await 还是有回调的,只是你没看到。
-
@KevinB 我认为你是对的,我认为类只是一个即将成为反模式的东西。使用异步代码库进入它们将是非常困难,摆脱它们编写真正有用的异步库将是非常困难,并且从未来来看对于来电者来说,写起来会非常尴尬,
await new Foo(url);我已经把问题说得更广泛了,我不想假设我知道答案。让我们拭目以待,看看是否有人鼓起其他任何东西。如果没有,我会赏金。
标签: asynchronous ecmascript-6 es6-promise es6-class