• javascript中async/await常用场景


    javascript中async/await常用场景

    我们开发过程中,经常会使用到Promise,它很好的解决了异步问题。但是,在业务逻辑比较复杂的情况下,单纯的使用Promise并不好用。这时,我们可以使用ES7中新添加的async/await,在async标记的函数中,如果遇到await表达式,则函数会等待await标记的Promise解析完成,然后才会继续执行下面的代码。
    那么,我们来举几个例子看看什么时候比较适合使用async/await:

    假设我们有如下两个方法:

    function convertToBase64Data(url) { // 转成base64格式
        return new Promise( resolve => {
          setTimeout( () => {
            resolve('img');
          }, 1000);
        });
      }
      function saveToLocal(img) { // 保存到本地
        return new Promise( resolve=> {
          setTimeout( () => {
            resolve('success');
          }, 200);
        });
      }

    场景1:多个异步需要按顺序:图片处理完成然后保存在本地

    用promise我们可能这样写:

    function fn1() {
            return convertToBase64Data('http://1.jpg').then( base64Data => {
                return saveToLocal(base64Data);
            })
        }

    使用await则更简洁,更好理解:

    async function fn1() {
        const base64Data = await download('http://1.jpg');
        const result = await saveToLocal(base64Data); 
        return result;
      }

    场景2:图片需要同时处理,但是要按顺序一张一张保存在本地

    不使用await:

    function fn2() {
           const promise1 = convertToBase64Data('http://1.jpg');
           const promise2 = convertToBase64Data('http://1.jpg');
           Promise.all([promise1,promise2]).then( datas => {
               saveToLocal(datas[0]).then( result1 => {
                   saveToLocal(datas[1]).then(result2 => {
                       console.log(result2);
                   })
               })
           })
        }

    我们看到,回调很多,很不方便,下面是使用await:

    async function fn2() {
            // 同时处理两张
            const promise1 = convertToBase64Data('http://1.jpg');
            const promise2 = convertToBase64Data('http://2.jpg');
            const [data1, data2] = await Promise.all([promise1, promise2]);
            // 先保存第一张
            const result = await saveToLocal(data1);
            // 再保存第二张
            const result2 = await saveToLocal(data2);
        }

    代码层次很清晰,很容易阅读。

    场景3:多张图片,处理一张保存一张,然后才能处理下一张

    不使用await:

    // 你来写写看!!!
    

    使用await:

    async function fn3() {
            const imgUrls = ['http://1.jpg', 'http://2.jpg', 'http://3.jpg', 'http://4.jpg', 'http://5.jpg'];
            for (let i = 0; i < imgUrls.length; i++) {
              const base64Data = await convertToBase64Data(imgUrls[i]);
              const result = await saveToLocal(base64Data);
              console.log(result);
            }
        }

    是不是觉得很爽?

    场景4:条件语句

    不使用await:

    function fn4(needConvertToBase64) {
        return download('http://1.jpg').then( img => {
          if (needConvertToBase64) {
            return convertToBase64(img).then(base64Data => {
              return base64Data;
            });
          } else {
            return img;
          }
        });
      }

    return 到让人迷茫。下面使用await, 这就很爽:

    async function fn4(needConvertToBase64) {
        const img = await download('http://1.jpg');
        if (needConvertToBase64) {
          const base64Data = await convertToBase64(img);
          return base64Data;
        }
        return img;
      }

    场景5: 你可能会这样:调用方法1,使用方法1返回的结果去调用方法2,然后使用两者的结果去调用方法3。

    假设有如下业务: 获取用户ID,然后根据ID获取用户信息,然后将两者保存在服务器。

    function getUserId() {
        return Promise.resolve('123123');
      }
      function getUserInfo(id) {
        return Promise.resolve({name: 'aaron'});
      }
      function saveToServer(id, userInfo) {
        return Promise.resolve('success');
      }

    你的代码很可能是这样的:

     function fn5() {
        return getUserId().then( id => { // 拿到id
          return getUserInfo(id).then( userInfo => {
            return saveToServer(id, userInfo);
          });
        });
      }

    使用await:

    async function fn5() {// 使用await
        const id = await getUserId();
        const userInfo = await getUserInfo(id);
        return saveToServer(id, userInfo);
      }

    场景6:错误处理

    不使用await,try/catch不能捕获saveToLocal的错误,convertToBase64 的Promise中,只能.catch处理,这样错误处理代码非常冗余,使代码很复杂:

    function fn6() {
        try {
          convertToBase64('http://1.jpg').then( data => {
            // saveToLocal可能会出错
            saveToLocal(data).then( result => {
              console.log(result);
            });
            // .catch(err => { console.log(err)}); // 只能在.catch中处理
          });
        } catch (err) { // 这里取不到saveToLocal的错误
          console.log(err);
        }
      }

    使用await,try/catch能捕获saveToLocal的错误:

    async function fn6() {
        try {
          const data = await convertToBase64('http://1.jpg');
          const result = await saveToLocal(data);
          console.log(result);
        } catch (err) {
          console.log(err);
        }
      }

    转自 https://www.jianshu.com/p/1bb680768e85




  • 相关阅读:
    正则表达式
    简单的js拖动
    asp.net网站安全常见问题与防范
    Jquery操作select、checkbox、radio详细讲解
    利用ListView自定义高效分页
    文件上传
    Sql 分区问题
    封装读取配置文件类
    TypeConverter学习
    构造AJAX参数, 表单元素JSON相互转换
  • 原文地址:https://www.cnblogs.com/douyage/p/15979401.html
Copyright © 2020-2023  润新知