(ES6)类(ES2017)异步/等待 getter

是否或者是否有可能有一个 ES6类 getter 从 ES2017等待/异步函数返回一个值。

class Foo {
async get bar() {
var result = await someAsyncOperation();


return result;
}
}


function someAsyncOperation() {
return new Promise(function(resolve) {
setTimeout(function() {
resolve('baz');
}, 1000);
});
}


var foo = new Foo();


foo.bar.should.equal('baz');
45873 次浏览

您只能进行 await承诺,而 async函数将返回自己的承诺。
当然,getter 也可以产生这样的承诺,这与正常值没有区别。

更新: 正如其他人所指出的,这并不真正有效。@kuboon 在这里有一个很好的解决方案 下面

你能做到的

class Foo {
get bar() {
return (async () => {
return await someAsyncOperation();
})();
}
}

也就是说

class Foo {
get bar() {
return new Promise((resolve, reject) => {
someAsyncOperation().then(result => {
resolve(result);
});
})
}
}

您可以通过调用方的 await获得该值。

class Foo {
get bar() {
return someAsyncOperation();
}
}
async function test(){
let foo = new Foo, val = await foo.bar;
val.should.equal('baz');
}

对于 getter 返回的值,这不会改变任何内容,因为 async函数无论如何都会返回一个 Promise。关键在于函数,因为 await只能用于 async函数。

如果在函数中希望出现 await的问题,我会这样做:

get property () {
const self = this; // No closure with `this`, create a closure with `self`.
async function f () { // `async` wrapper with a reference to `self`
const x = await self.someFunction(); // Can use `await`
// the rest with “self” in place of “this”
return result;
}
return f(); // Returns a `Promise` as should do an `async get`
}