【问题标题】:(ES6) class (ES2017) async / await getter(ES6) 类 (ES2017) async / await getter
【发布时间】:2016-02-26 01:15:53
【问题描述】:

是否有或将有可能有一个 ES6 类 getter 从 ES2017 的 await / async 函数返回一个值。

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');

【问题讨论】:

  • 这就是你所需要的:get bar(){ return someAsyncOperation(); }
  • @FelixKling 我更新了我的帖子,希望能澄清我的问题。我不是想从 getter 返回一个函数。我希望返回值来自异步操作。
  • 我明白 return someAsyncOperation();会返回一个承诺。我想返回承诺的结果。 foo.bar 应该返回 'baz'
  • 不能。您不能从异步函数同步返回。 async/await 只是围绕承诺 + 生成器的语法糖。它可以让您编写看起来同步的代码,但它仍然异步运行。在最高级别,您仍然必须处理承诺。 await foo.bar 或许可以,但如果不行,则必须直接处理foo.bar 返回的promise。
  • 如果你能这样做就好了:get async functionName(){}。我希望能够(直接)在吸气剂内部等待,而不是在这里回答的迂回方式。

标签: ecmascript-6 async-await ecmascript-2017


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    你可以这样做

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

    又是一样的

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

    【讨论】:

    • 不,它不会按照 Enki 的要求返回结果,但承诺
    • 这与get bar(){ return someAsyncOperation() }完全相同
    • class Foo { get bar() { return (async () => await someAsyncOperation)() } }
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      对于 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`
      }
      

      【讨论】:

        猜你喜欢
        • 2017-08-31
        • 2017-07-20
        • 2016-04-28
        • 2018-11-12
        • 2019-10-15
        • 1970-01-01
        • 2015-09-26
        • 1970-01-01
        相关资源
        最近更新 更多