71

是否有可能让 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');
4

4 回答 4

60

更新:正如其他人指出的那样,这并没有真正起作用。@kuboon 在下面的答案中有一个很好的解决方法。

你可以这样做

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

这又是一样的

class Foo {
    get bar() {
        return new Promise((resolve, reject) => {
            someAsyncOperation().then(result => {
                resolve(result);
            });
        })
    }
}
于 2016-09-08T10:00:51.357 回答
18

您可以await在调用方获取值。

class Foo {
    get bar() {
        return someAsyncOperation();
    }
}
async function test(){
  let foo = new Foo, val = await foo.bar;
  val.should.equal('baz');
}
于 2018-11-09T05:27:52.940 回答
16

你只能await承诺,而async函数本身会返回承诺。
当然,getter 也可以产生这样的承诺,与正常值没有区别。

于 2015-11-23T19:49:39.707 回答
2

对于 getter 返回的值,这不会改变任何事情,因为async函数Promise无论如何都会返回 a。重要的是在函数中,因为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`
}
于 2020-04-21T23:22:35.517 回答