Vue学习笔记——Promise的使用

视频资源来自:b站coderwhy王红元老师——最全最新Vue、Vuejs教程,从入门到精通
文章仅为个人观看视频后的学习心得笔记,用于个人查看和记录保存。文中定有疏漏错误之处,恳请指正。

Promise是异步编程的一种解决方案。

回调地狱

Promise的基本使用

定时器的异步事件

参数 -> 函数(resolve,reject)
resolve,reject本身又是函数
链式编程

new Promise((resolve,reject) =>{
  setTimeout(() =>{
    resolve()
  },1000)
}).then(() =>{
  console.log('Hello world')

  return new Promise((resolve ,reject) =>{
    setTimeout(() =>{
      resolve()
    },1000)
  })
}).then(() =>{
  console.log('Hello vuejs')

  return new Promise((resolve ,reject) =>{
    setTimeout(() =>{
      resolve()
    },1000)
  })
})

什么情况会用到Promise?

一般情况下,使用Promise对这个异步操作进行封装

new -> 构造函数(1.保存了一些状态信息 2.执行传入的函数)

在执行传入的回调函数时,会传入两个参数,resolve,reject,本身又是函数

请求与处理分离,变得优雅。。

new Promise((resolve,reject) =>{
  setTimeout(() =>{
    //成功的时候调用resolve
    //resolve()

    //失败的时候调用reject
    reject('error message')
  },1000)
}).then(data => {
  console.log(data);
  console.log(data);
}).catch(err =>{
  console.log(err)
})

控制台输出 error message

then前面的函数必须返回一个Promise对象

 return Promise.resolve(taskName)

Promise三种状态

<font color=#909534>sync ->synchronization -> 同步</font>

<font color=#909534>async ->asynchronization -> 异步</font>

<font color=#909534>operation -> 操作</font>

image-20210711211042996

wrapped into
网络请求:aaa -> 自己处理(10行)
处理:aaa 111 -> 自己处理(10行)
处理:aaa 222 -> 自己处理

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.resolve(res + '111')
}).then(res =>{
  console.log(res,'第二层的10行处理代码');

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

3.省略掉Promise.resolve

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

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

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

结果:<img src="https://xiao910888.oss-cn-hangzhou.aliyuncs.com/img/image-20210711224516288.png" alt="image-20210711224516288" style="zoom: 67%;" />

多个 共用一个catch。抓住错误

1.reject,catch

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

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

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

2.throw,catch

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

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

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

1.ajax异步访问:

两个请求同时到达时才能处理

//请求一:
let isResult1 =false
let isResult2 =false
$ajax({
  url: '',
  success: function () {
    console.log('结果一');
    isResult1 = true
    handleResult()
  }
})
//请求二:
$ajax({
  url: '',
  success: function () {
    console.log('结果二');
    isResult2 = true
    handleResult()
  }
})

function handleResult() {
  if(isResult1 &&isResult2){
  }
}

<font color=#909534>iterator:可迭代的(数组)</font>

2.Promise的异步访问

<script>
  Promise.all([
      new Promise((resolve,reject) =>{
        setTimeout(() =>{
          resolve('result1')
        },2000)
      }),
      new Promise((resolve,reject) =>{
        setTimeout(() =>{
          resolve('result1')
        },1000)
      })
  ]).then(result =>{
    //results是个数组,results[0]代表第一个请求
    console.log(results);
  })

总目录:
邂逅Vuejs
Vue基础语法
组件化开发
前端模块化
webpack详解
Vue CLI详解
vue-router
Promise的使用
Vuex详解
网络模块封装
项目实战

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容