这永远行不通。
关键字允许在标记为的函数中使用,但它也将该函数转换为承诺生成器。因此,标记为 的函数将返回一个 promise。另一方面,构造函数返回它正在构造的对象。因此,我们遇到了一种情况,即您希望同时返回对象和承诺:一个不可能的情况。async
await
async
async
您只能在可以使用 promise 的地方使用 async/await,因为它们本质上是 promise 的语法糖。不能在构造函数中使用 promise,因为构造函数必须返回要构造的对象,而不是 promise。
有两种设计模式可以克服这一点,这两种模式都是在承诺出现之前发明的。
-
函数的使用。这有点像jQuery的。您创建的对象只能在其自身或函数内部使用:init()
.ready()
init
ready
用法:
var myObj = new myClass();
myObj.init(function() {
// inside here you can use myObj
});
实现:
class myClass {
constructor () {
}
init (callback) {
// do something async and call the callback:
callback.bind(this)();
}
}
-
使用构建器。我还没有在javascript中看到过太多使用,但这是Java中需要异步构造对象时更常见的解决方法之一。当然,在构造需要大量复杂参数的对象时,会使用生成器模式。这正是异步构建器的用例。不同之处在于,异步生成器不返回对象,而是返回该对象的承诺:
用法:
myClass.build().then(function(myObj) {
// myObj is returned by the promise,
// not by the constructor
// or builder
});
// with async/await:
async function foo () {
var myObj = await myClass.build();
}
实现:
class myClass {
constructor (async_param) {
if (typeof async_param === 'undefined') {
throw new Error('Cannot be called directly');
}
}
static build () {
return doSomeAsyncStuff()
.then(function(async_result){
return new myClass(async_result);
});
}
}
使用异步/等待实现:
class myClass {
constructor (async_param) {
if (typeof async_param === 'undefined') {
throw new Error('Cannot be called directly');
}
}
static async build () {
var async_result = await doSomeAsyncStuff();
return new myClass(async_result);
}
}
注意:尽管在上面的示例中,我们对异步构建器使用 promise,但严格来说,它们并不是必需的。您可以轻松编写接受回调的构建器。
关于在静态函数内部调用函数的注意事项。
这与异步构造函数没有任何关系,而是与关键字的实际含义有关(对于来自自动解析方法名称的语言(即不需要关键字的语言)的人来说,这可能有点令人惊讶)。this
this
关键字引用实例化的对象。不是类。因此,您通常不能在静态函数内部使用,因为静态函数未绑定到任何对象,而是直接绑定到类。this
this
也就是说,在下面的代码中:
class A {
static foo () {}
}
您不能执行以下操作:
var a = new A();
a.foo() // NOPE!!
相反,您需要将其称为:
A.foo();
因此,下面的代码将导致错误:
class A {
static foo () {
this.bar(); // you are calling this as static
// so bar is undefinned
}
bar () {}
}
要修复它,您可以创建常规函数或静态方法:bar
function bar1 () {}
class A {
static foo () {
bar1(); // this is OK
A.bar2(); // this is OK
}
static bar2 () {}
}