ZhengXingchi / ZhengXingchi.github.io

Apache License 2.0
0 stars 0 forks source link

异步async/await相比于Promise的优势 #13

Open ZhengXingchi opened 4 years ago

ZhengXingchi commented 4 years ago
ZhengXingchi commented 4 years ago

参考文章

如何在Promise链中共享变量? Async/Await替代Promise的6个理由

ZhengXingchi commented 4 years ago

关于Promise与async/await错误处理

Async/Await 让 try/catch 可以同时处理同步和异步错误。在下面的 promise 示例中,try/catch 不能处理 JSON.parse 的错误,因为它在 Promise 中。我们需要使用.catch,这样错误处理代码非常冗余。并且,在我们的实际生产代码会更加复杂。

Promise

    const makeRequest = () => {
      try {
        getJSON().then(result => {
          // JSON.parse可能会出错
          const data = JSON.parse(result);
          console.log(data);
        });
        // 取消注释,处理异步代码的错误
        // .catch((err) => {
        //   console.log(err)
        // })
      } catch (err) {
        console.log(err);
      }
    };  

async/await

   const makeRequest = async () => {
      try {
        // this parse may fail
        const data = JSON.parse(await getJSON());
        console.log(data);
      } catch (err) {
        console.log(err);
      }
    };
ZhengXingchi commented 4 years ago

Promise传递中间值的痛苦

promise3只需要value2

   const makeRequest = () => {
      return promise1().then(value1 => {
        return value1
      })
        .then(value1 => {
          return promise2(value1)
        })
        .then(value2 => {
          return promise3(value2)
        });
    };

当Promise3需要value1和value2

  const makeRequest = () => {
      return promise1().then(value1 => {
        return promise2(value1).then(value2 => {
          return promise3(value1, value2)
        })
      })
    };

刚从嵌套出来又进入嵌套了,地狱啊。这时候你会心一笑,机智如我,写出以下代码

  const makeRequest = () => {
      return promise1().then(value1 => {
        return Promise.all([value1, promise2(value1)])
      })
        .then(([value1, value2]) => {
        })
    };

这时候我就想一嘴的汽水喷死你,你这不是高射炮打苍蝇(多此一举) 吗?杀鸡焉用牛刀呢。 这种方法为了可读性牺牲了语义。除了避免嵌套,并没有其他理由将 value1 和 value2 放在一个数组中。 好到用在刀刃上,这时候async/await闪亮登场,当当当。。。


    const makeRequest = async () => {
      const value1 = await promise1();
      const value2 = await promise2(value1);
      return promise3(value1, value2);
    };