async functions return promises, and await pauses until a promise has a value.

async await `await` unwraps a promise inside an `async` function.

Async and Await

startValue
await.ts
Replay: real traced execution (multi-file project)
async function doubleLater(value: number): Promise<number> {
    const doubled: number = await Promise.resolve(value * 2);
    return doubled;
}

const startValue: number = 4;

async function main(): Promise<void> {
    const result: number = await doubleLater(startValue);
    console.log(`result=${result}`);
}

main();
async function doubleLater(value: number): Promise<number> {
    const doubled: number = await Promise.resolve(value * 2);
    return doubled;
}

const startValue: number = 2;

async function main(): Promise<void> {
    const result: number = await doubleLater(startValue);
    console.log(`result=${result}`);
}

main();
async function doubleLater(value: number): Promise<number> {
    const doubled: number = await Promise.resolve(value * 2);
    return doubled;
}

const startValue: number = 7;

async function main(): Promise<void> {
    const result: number = await doubleLater(startValue);
    console.log(`result=${result}`);
}

main();
  1. startValue ← 4

    3    return doubled;4}56const startValue→ 4: number = 4;  //@startValue=2, 778async function main(): Promise<void> {9    const result: number = await doubleLater(startValue);10    console.log(`result=${result}`);11}1213main();
  2. //@startValue=2, 7 async function main(): Promise<void>

    6const startValue: number = 4;  //@startValue=2, 778async function main(): Promise<void> {9    const result: number = await doubleLater(startValue4);10    console.log(`result=${result}`);
  3. async function doubleLater(value: number): Promise<number>

    1async function doubleLater(value4: number): Promise<number> {2    const doubled: number = await Promise.resolve(value * 2);3    return doubled;
  4. doubled ← 8, value ← 4

    1async function doubleLater(value: number): Promise<number> {2    const doubled→ 8: number = await Promise.resolve(value→ 4 * 2);3    return doubled8;4}56const startValue: number = 4;  //@startValue=2, 778async function main(): Promise<void> {9    const result: number = await doubleLater(startValue);10    console.log(`result=${result}`);11}1213main();
  5. result ← 8

    8async function main(): Promise<void> {9    const result→ 8: number = await doubleLater(startValue4);10    console.log(`result=${result8}`);11}
    outputresult=8
  1. startValue ← 2

    3    return doubled;4}56const startValue→ 2: number = 2;78async function main(): Promise<void> {9    const result: number = await doubleLater(startValue);10    console.log(`result=${result}`);11}1213main();
  2. async function main(): Promise<void>

    6const startValue: number = 2;78async function main(): Promise<void> {9    const result: number = await doubleLater(startValue2);10    console.log(`result=${result}`);
  3. async function doubleLater(value: number): Promise<number>

    1async function doubleLater(value2: number): Promise<number> {2    const doubled: number = await Promise.resolve(value * 2);3    return doubled;
  4. doubled ← 4, value ← 2

    1async function doubleLater(value: number): Promise<number> {2    const doubled→ 4: number = await Promise.resolve(value→ 2 * 2);3    return doubled4;4}56const startValue: number = 2;78async function main(): Promise<void> {9    const result: number = await doubleLater(startValue);10    console.log(`result=${result}`);11}1213main();
  5. result ← 4

    8async function main(): Promise<void> {9    const result→ 4: number = await doubleLater(startValue2);10    console.log(`result=${result4}`);11}
    outputresult=4
  1. startValue ← 7

    3    return doubled;4}56const startValue→ 7: number = 7;78async function main(): Promise<void> {9    const result: number = await doubleLater(startValue);10    console.log(`result=${result}`);11}1213main();
  2. async function main(): Promise<void>

    6const startValue: number = 7;78async function main(): Promise<void> {9    const result: number = await doubleLater(startValue7);10    console.log(`result=${result}`);
  3. async function doubleLater(value: number): Promise<number>

    1async function doubleLater(value7: number): Promise<number> {2    const doubled: number = await Promise.resolve(value * 2);3    return doubled;
  4. doubled ← 14, value ← 7

    1async function doubleLater(value: number): Promise<number> {2    const doubled→ 14: number = await Promise.resolve(value→ 7 * 2);3    return doubled14;4}56const startValue: number = 7;78async function main(): Promise<void> {9    const result: number = await doubleLater(startValue);10    console.log(`result=${result}`);11}1213main();
  5. result ← 14

    8async function main(): Promise<void> {9    const result→ 14: number = await doubleLater(startValue7);10    console.log(`result=${result14}`);11}
    outputresult=14