web-dev-qa-db-fra.com

Comment les moteurs JavaScript convertissent-ils Async / attendre des promesses sous la hotte?

Je suis curieux de convertir la syntaxe async/attendre la syntaxe Promise s. Peut-être que je ne pense pas à cela correctement, mais je ne sais pas comment ce code serait converti en une promesse:

async function myFunc(doAwait) {
    doSomething();
    if (doAwait) {
        await doSomethingAsync();
    }

    return doSomethingElse();
}

Lorsque doAwait est false, je m'attendrais à ce que cette fonction soit équivalente à:

return new Promise(res => {
    doSomething();
    res(doSomethingElse());
});

Si c'est true, ce serait:

return new Promise(() => { doSomething(); })
    .then(() => doSomethingAsync())
    .then(() => doSomethingElse());

Cela pourrait faire quelque chose comme:

let p = new Promise(() => { doSomething(); });
if (doAwait) {
    p = p.then(() => doSomethingAsync());
}
return p.then(() => doSomethingElse());

Mais cela introduit un supplément, éventuellement inutile then. Peut-être que c'est juste inévitable.

2
dx_over_dt

Cette async/await code:

async function myFunc(doAwait) {
    doSomething();
    if (doAwait) {
        await doSomethingAsync();
    }

    return doSomethingElse();
}

Serait fondamentalement équivalent à ceci:

function myFunc(doAwait) {
    doSomething();
    if (doAwait) {
        return Promise.resolve(doSomethingAsync()).then(doSomethingElse);
    }

    return Promise.resolve(doSomethingElse());
}

Pour une équivalence complète, y compris des exceptions synchrones dans l'une quelconque des appels de fonctions, ce serait quelque chose comme ceci:

function myFunc(doAwait) {
    try {
        doSomething();
        if (doAwait) {
            return Promise.resolve(doSomethingAsync()).then(doSomethingElse);
        }

        return Promise.resolve(doSomethingElse());
    } catch(e) {
        return Promise.reject(e);
    }
}
3
jfriend00