web-dev-qa-db-fra.com

(ES6) classe (ES2017) asynchrone / attente getter

Est-il possible ou possible qu'un getter de classe ES6 renvoie une valeur à partir d'une fonction d'attente/async 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');
47
Enki

Tu peux le faire

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

qui est à nouveau le même que

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

Vous ne pouvez que await promesses, et les fonctions async renverront elles-mêmes les promesses.
Bien sûr, un getter peut aussi faire une telle promesse, il n'y a pas de différence avec une valeur normale.

16
Bergi

Vous pouvez obtenir la valeur par await du côté de l'appelant.

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