箭头函数, Promise对象, async/await语法糖, fetch的综合理解与使用
2023-2-22 10:45:45
1. 箭头函数 (arg1, arg2)=>{}
匿名函数, 如果参数只有一个, 可以不用小括号:
arg => {console.log(arg);}
说这个是为了方便理解下边的代码
2. Promise对象, 异步语法 (可参考)
基本使用:
1 //======成功 2 let p = new Promise((success, error) => { 3 success(['1', '2']); //不用return 4 }) 5 .then(rs => {console.log('success', rs);}) //会走到这里 6 .catch(rs => {console.log('error', rs);}); 7 8 9 10 //======失败/异常 11 let p1 = new Promise((success, error) => { 12 error([3, 4]); //不用return 13 }) 14 .then(rs => {console.log('success', rs);}) 15 .catch(rs => {console.log('error', rs);}); //会走到这里
1 let pms = new Promise(function(resolve, reject){ 2 rs = window.prompt('how are you', 'ok'); 3 if (rs) { 4 resolve(rs); 5 } else { 6 reject('no thing input'); 7 } 8 }) 9 .then(rs => {console.log('11111'+rs);}) 10 .catch(rs => {console.log('22222'+rs);});
组合使用:
Promise.all([p1, p2]) .then() .catch(); |
将多个Promise对象包在一起, 1. 全都走了success回调的时候, 才会走到Promise.all().then()方法, 2. 其中任何一个子Promise走了error方法, 就会走Promise.all().cath() |
Promise.race([p1, p2]) .then() .catch(); |
将多个Promise对象包在一起, 谁先调用success或error, 就会将结果传给Promise.race().then()或catch() |
Promise.allSettled([p1, p2]) .then() .catch(); |
将多个Promise对象包在一起, 所有的子promise都执行完了才会走到Promise.allSettled().then() |
Promise.any([p1, p2]) .then() .catch(); |
将多个Promise对象包在一起, 1. 任何一个子promise走了success就会走到Promise.any().then() 2. 所有的子promise都走了error,才会走到catch() |
其他 |
3. async/await
将一个普通方法转换成Promise对象, 简化了Promise的使用, 可以不用写then了, 我自己不推荐使用, 需要用得可以参考相关文章
4. fetch
1. 虽然Promise是异步管理器, 但Promise并不会发起请求, 具体的异步请求服务器还要fetch或xhr去执行
2. fetch请求后返回值是Promise对象, 所以也有then()和catch()方法.
3. fetch只有在不能成功发起请求的时候才会走catch(), 如果请求成功了, 但服务器返回500,是不会走到catch()中的
4.代码参考 (更多用法参考)
1 fetch('http://www.test7.com/index.php') //也可以传入一个 Request 对象, 指定get/post, 是否上传cookie等配置 2 .then(rs => { 3 console.log(rs); //返回的是一个 Response 对象 4 console.log(rs.ok); //true/false 5 console.log(rs.status); //200/500 ... 6 console.log(rs.statusText); //OK 7 return rs.json(); //把返回结果解析成json格式 8 // return rs.text(); //把返回结果解析成string 9 // return rs.blob(); //返回图像等二进制数据时使用 10 }) 11 .then(rs => {console.log(rs);}) //rs是上一个then的return值 12 .catch(rs => {console.log(rs);}) //catch 有网络故障, 或者第一个then中取值错误等异常时走到这里