Promise异步编程进阶

Promise的使用

<script>
    // 参数 -> 函数(resolve, reject)
    // resolve, reject本身它们又是函数
    // 链式编程
    new Promise((resolve, reject) => {

      // 第一次网路请求的代码 
      setTimeout(() => {
        resolve()
      }, 2000)
    }).then(() => {
      console.log('Hello World');
      console.log('Hello World');
      console.log('Hello World');
      console.log('Hello World');
      console.log('Hello World');

      return new Promise((resolve, reject) => {

        // 第二次网络请求的代码
        setTimeout(() => {
          resolve()
        }, 1000)
      })
    }).then(() => {
      // 第二次处理的代码
      console.log('Hello Vue.js');
      console.log('Hello Vue.js');
      console.log('Hello Vue.js');
      console.log('Hello Vue.js');
      console.log('Hello Vue.js');

      return new Promise((resolve, reject) => {

        // 第三次网络请求的代码
        setTimeout(() => {
          resolve()
        }, 1000)
      })
    }).then(() => {
      // 第三次处理的代码
      console.log('Hello css');
      console.log('Hello css');
      console.log('Hello css');
      console.log('Hello css');
      console.log('Hello css');
    })

    new Promise((resolve, reject) => {
      setTimeout(() => {
        // 成功的时候
        resolve('异步传数据')

        // 失败的时候
        // reject('error message')
      }, 5000)
    // .then((data) => 只有一个参数,data括号可以省略
    }).then((data) => {
      console.log('成功反馈');
      console.log(data);
      console.log(data);
      console.log(data);
      console.log(data);
      console.log(data);
    }).catch(err => {
      // 捕获错误信息
      console.log('错误信息');
      console.log(err);
      console.log(err);
      console.log(err);
      console.log(err);
      console.log(err);
    })
  </script>

什么情况下用到Promise?
一般情况下是有异步操作时,使用Promise对这个异步操作进行封装
new -> 构造函数(1.保存了一些状态信息 2.执行传入的函数)
在执行传入的回调函数时,会传入两个参数,resolve,reject,本身又是函数

Promise的另种处理形式

<script>
    // then(函数一:成功, 函数二:失败)
    new Promise((resolve, reject) => {
      setTimeout(() => {
        // resolve('Hello Vue.js')
        reject('error message')
      }, 1000)
    }).then(data => {
      console.log(data);
    }, err => {
      console.log(err);
    })  
  </script>

Promise的链式调用

<script>
    // wrapped into 内部包装
    new Promise((resolve, reject) => {
      setTimeout(() => {
        resolve('aaa')
      }, 1000)
    }).then(res => {
      // 1.自己处理10行代码
      console.log(res, '第一层的10行处理代码');

      // 2.对结果进行第一次处理
      return new Promise((resolve) => {
        resolve(res + '111')
      })
    }).then(res => {
      console.log(res, '第二层的10行处理代码');

      return new Promise(resolve => {
        resolve(res + '222')
      })
    }).then(res => {
      console.log(res, '第三层的10行处理代码')
    })  

    //简写
    new Promise((resolve, reject) => {
      setTimeout(() => {
        resolve('aaa')
      }, 1000)
    }).then(res => {
      // 1.自己处理10行代码
      console.log(res, '第一层的10行处理代码');

      // 2.对结果进行第一次处理
      // 捕获失败信息
      return Promise.reject('error')
      //手动抛出异常
      throw 'error message'

      return Promise.resolve(res + '111')
    }).then(res => {
      console.log(res, '第二层的10行处理代码');

      return Promise.resolve(res + '222')
    }).then(res => {
      console.log(res, '第三层的10行处理代码')
    }).catch(err => {
      console.log(err);
    }) 

    // 省略Promise.resolve
    new Promise((resolve, reject) => {
      setTimeout(() => {
        resolve('aaa')
      }, 1000)
    }).then(res => {
      // 1.自己处理10行代码
      console.log(res, '第一层的10行处理代码');

      // 2.对结果进行第一次处理
      return res + '111'
    }).then(res => {
      console.log(res, '第二层的10行处理代码');

      return res + '222'
    }).then(res => {
      console.log(res, '第三层的10行处理代码')
    })  
  </script>

Promise的all方法使用

<script>
  Promise.all([
    new Promise((resolve, reject) => {
      setTimeout(() => {
        // resolve('result1')
        resolve({name: 'why', age: 18})
      }, 2000)
    }),
    new Promise((resolve, reject) => {
      setTimeout(() => {
        // resolve('result2')
        resolve({name: 'blue', age: 19})
      }, 1000)
    })
  ]).then(results => {
    console.log(results)
  })
</script>

My Blog: https://coderblue.cn/
Github:https://github.com/onecoderly
My Project:https://coderblue.cn/project/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值