技术分享-PROMISE和ASYNC介绍

promise介绍
promise应用
async/await介绍
async/await应用
总结

1、promise介绍
1.1、promise含义
1)promise是ES6提供的异步编程的一种方案,优于传统的回调方案。
2)promise有三种状态:pending(进行中),fulfilled已成功),rejected(已失败)。异步操作结果可修改其状态,其他操作无法修改状态。状态一旦改变就不会再变;状态只会从pending变成fulfilled或者从pending变成rejected。
3)promise一旦新建会理解执行,无法中途取消。promise内部的错误只会反应到回调函数中,不会反应到外部。
1.2、promise基本用法
1)promise对象是一个构造函数,通过生成实例的方式使用。构造函数接受一个函数为参数,该函数有两个参数(resolve,reject),并且这两个参数也为两个函数,resolve是异步成功时调用,reject是异步失败调用。
2)promise实例具有then函数,then函数是一个处理resolved状态和rejected状态的回调函数。
3)promise实例catch函数,专门处理rejected状态的回调函数。
4)Promise.all函数,Promise.all可以将多个Promise实例包装成一个新的Promise实例。所有异步操作全部完成后才进行回调。成功的时候返回的是一个结果数组,而失败的时候则返回最先被reject失败状态的值。
5)Promise.race函数,Promise.race把多个promise实例包装成一个新的promise。哪个结果获取的快,就直接返回那个结果。不管结果成功与否。

2、promise应用

  1 <script>
  2 //模拟异步操作
  3 function promiseClick(){
  4 let p = new Promise((resolve, reject) => {
  5 setTimeout(function(){
  6 var num = Math.ceil(Math.random()*20); //生成1-10的随机数
  7 console.log('随机数生成的值:',num)
  8 if(num<=10){
  9 resolve(num);
 10 }
 11 else{
 12 reject('数字大于10了即将执行失败回调');
 13 }
 14 }, 2000);
 15 })
 16 return p
 17 } 
 18 //then回调(含有两个参数 参数都是函数 第一个函数是成功的回调。第二个失败的回调(可省略))
 19 promiseClick().then((data) => {
 20 console.log('resolved成功回调');
 21 console.log('成功回调接受的值:',data);
 22 },(reason) => {
 23 console.log('catch到rejected失败回调');
 24 console.log('catch失败执行回调抛出失败原因:',reason);
 25 });
 26 //then().catch()--catch是失败回调的另一种写法
 27 promiseClick()
 28 .then((data) => {
 29 console.log('resolved成功回调');
 30 console.log('成功回调接受的值:',data);
 31 })
 32 .catch((reason) => {
 33 console.log('catch到rejected失败回调');
 34 console.log('catch失败执行回调抛出失败原因:',reason);
 35 });
 36 
 37 //async的调用
 38 async function handleClick(){
 39 try {
 40 let result = await promiseClick();
 41 console.log(result);
 42 } catch (err){
 43 console.log(err);
 44 }
 45 }
 46 //方法调用
 47 //hndleClick();
 48 //配方(3s)--判断(2s)--发药(1s)
 49 //原始做法(回调地狱)
 50 function handleInfo(){
 51 setTimeout(function(){
 52 console.log('配方操作完毕!');
 53 setTimeout(function(){
 54 console.log('特殊药品判断完毕!');
 55 setTimeout(function(){
 56 console.log('发药操作完毕!');
 57 }, 1000);
 58 }, 2000);
 59 }, 3000);
 60 }
 61 handleInfo();
 62 
 63 function drugRecipe(){
 64 console.log('药品发药--配方操作!');
 65 var p = new Promise(function(resolve, reject){ //做一些异步操作
 66 setTimeout(function(){
 67 console.log('配方操作完毕!');
 68 resolve('配方操作完成!');
 69 }, 3000);
 70 });
 71 return p;
 72 }
 73 function special(){
 74 console.log('药品发药-特殊药品判断操作!');
 75 var p = new Promise(function(resolve, reject){ //做一些异步操作
 76 setTimeout(function(){
 77 console.log('特殊药品判断完毕!');
 78 resolve('特殊药品判断完成!');
 79 }, 2000);
 80 });
 81 return p;
 82 }
 83 function drugSend(){
 84 console.log('药品发药-发药操作!');
 85 var p = new Promise(function(resolve, reject){ //做一些异步操作
 86 setTimeout(function(){
 87 console.log('发药操作完毕!');
 88 resolve('发药操作完成!');
 89 }, 1000);
 90 });
 91 return p;
 92 }
 93 //promise依次调用
 94 drugRecipe().then(()=>{
 95 special().then(() => {
 96 drugSend();
 97 })
 98 })
 99 
100 //promise依次调用
101 drugRecipe()
102 .then(()=>{
103 return special();
104 })
105 .then(()=>{
106 return drugSend();
107 })
108 
109 
110 //promise.all()--配方特殊处方判断
111 Promise.all([drugRecipe(), special()])
112 .then((result) => {
113 console.log(result);
114 console.log('配方与特殊药品判断完成!');
115 })
116 
117 //promise.race()的使用--配方与特殊药品判断
118 Promise.race([drugRecipe(), special()])
119 .then((result) => {
120 console.log(result);
121 console.log('配方与特殊药品已有操作完成!');
122 })
123 
124 //async/await调用
125 async function allHandle(){
126 await drugRecipe();
127 await special();
128 await drugSend();
129 }
130 //调用
131 allHandle();
132 </script>

 

3、async/await介绍
3.1、async/await含义
1)async是ES7实现的异步编程的更优的解决方案。
2)async/await:async声明一个异步函数,awiat等待异步函数的完成。
3)async函数返回的Promise对象,必须等到内部所有await命令的Promise对象执行完,才会发生状态改变。
3.2、async/await基本用法
1)await并且用在async声明的方法里,否则会报错。
2)await的后面需要是一个Promise对象,如果不是则会被转成Promise对象。如果promise对象变为reject流程中断。
3) async/await处理异常:把await放入try {} catch {}中,捕获异常进行处理。

4、async/await应用

//async的调用
async function handleClick(){
try {
let result = await promiseClick();
console.log(result);
} catch (err){
console.log(err);
}
} 
//async/await调用
async function allHandle(){
await drugRecipe();
await special();
await drugSend();
}
//调用
allHandle();

 

 

5、总结
1)Async/await是近些年来JavaScript最具革命性的新特性之一。他让读者意识到使用Promise存在的一些问题,并提供了自身来代替Promise的方案。
2)Async/await更加的简洁。
3)Async/Await让try/catch可以同时处理同步和异步错误。

posted @ 2020-06-11 16:44  Soujer  阅读(244)  评论(0)    收藏  举报