文章

Async_Await中的resolve和reject实践

Async/Await中的resolve和reject实践

Async/Await中的resolve和reject实践

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<script>
  const func1 = () => {
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        console.log('1');
        resolve('11');
      }, 1000)
    })
  }

  const func2 = () => {
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        console.log('2');
        resolve('22');
      }, 1000)
    })
  }

  (async function () {
    console.log('0');
    const one = await func1();
    console.log(one);
    const two = await func2();
    console.log(two);
  }())

// 0
两秒后
// 1
// 11
四秒后
// 2
// 22
</script>

如果把 func1resolve() 注释掉:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<script>
  const func1 = () => {
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        console.log('1');
        // resolve('11');
      }, 1000)
    })
  }

  const func2 = () => {
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        console.log('2');
        resolve('22');
      }, 1000)
    })
  }

  (async function () {
    console.log('0');
    const one = await func1();
    console.log(one);
    const two = await func2();
    console.log(two);
  }())

// 0
两秒后
// 1
</script>

此时由于 func1 没有 resolve()reject() ,会阻塞 func2() 的执行。


把 func1 的 resolve() 改为 reject()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<script>
  const func1 = () => {
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        console.log('1');
        reject('11');
      }, 1000)
    })
  }

  const func2 = () => {
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        console.log('2');
        resolve('22');
      }, 1000)
    })
  }

  (async function () {
    console.log('0');
    const one = await func1();
    console.log(one);
    const two = await func2();
    console.log(two);
  }())

// 0
// 两秒后
// 1
// 报错:Uncaught (in promise) 11
</script>

再用 try-catch 检测 func1() 错误:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<script>
  const func1 = () => {
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        console.log('1');
        reject('err - 11');
      }, 1000)
    })
  }

  const func2 = () => {
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        console.log('2');
        resolve('22');
      }, 1000)
    })
  }

  (async function () {
    console.log('0');
    try {
      const one = await func1();
      console.log(one);
    } catch (err) {
      console.log(err)
    }
    const two = await func2();
    console.log(two);
  }())

// 0
两秒后
// 1
// err - 11
四秒后
// 2
// 22
</script>

监测到 func1() 的错误,发现没有阻塞 func2() 的执行。


把 await func1() 和 await func2() 都放入 try 里面:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<script>
  const func1 = () => {
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        console.log('1');
        reject('err - 11');
      }, 1000)
    })
  }

  const func2 = () => {
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        console.log('2');
        resolve('22');
      }, 1000)
    })
  }

  (async function () {
    console.log('0');
    try {
      const one = await func1();
      console.log(one);
      const two = await func2();
   		console.log(two);
    } catch (err) {
      console.log(err)
    }
  }())

// 0
两秒后
// 1
// err - 11
</script>

同样阻塞。


此时如果 func1() 没有 resolve()reject()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<script>
  const func1 = () => {
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        console.log('1');
        // reject('err - 11');
      }, 1000)
    })
  }

  const func2 = () => {
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        console.log('2');
        resolve('22');
      }, 1000)
    })
  }

  (async function () {
    console.log('0');
    try {
      const one = await func1();
      console.log(one);
    } catch (err) {
      console.log(err)
    }
    const two = await func2();
    console.log(two);
  }())

// 0
// 两秒后
// 1
</script>

没有报错,会阻塞 func2()

本文由作者按照 CC BY 4.0 进行授权