前端JS基础知识复习笔记(17)---Promise+ajax的回调地狱
2020-07-08 17:12
155 查看
let promiseExamp = new Promise(); //=>Uncaught TypeError: Promise resolver undefined is not a function
new Promise([executor]):第一个执行函数必须传递
* [executor 简称EXE]
* 1.NEW PROMISE的时候就会把EXE执行,创建PROMISE的一个实例(EXE是PROMISE类的一个回调函数,PROMISE内部会把它执行)
* 2.PROMISE不仅把EXE执行,而且还给EXE传递两个参数(两个参数也是函数类型):
* =>resolve函数:它执行代表PROMISE处理的异步事情是成功的,把PROMISE的状态改为fulfilled
* =>reject函数:它执行代表PROMISE处理的异步事情是失败的,把PROMISE的状态改为rejected
* 3.EXE函数中放的就是当前要处理的异步操作事情
let promiseExamp = new Promise((resolve, reject) => { //=>这里一般存放的都是我们即将要处理的异步任务,任务成功我们执行resolve,任务失败我们执行reject(当然写同步的也可以) let ran = Math.random(); setTimeout(() => { if (ran < 0.5) { reject(ran); return; } resolve(ran); }, 1000); }); promiseExamp.then(result => { //=>状态为FULFILLED成功后执行(RESULT:[[PromiseValue]]) console.log('成功: ' + result); }, error => { //=>状态为REJECTED失败后执行 console.log('失败: ' + error); });
console.log(a); //=>Uncaught ReferenceError: a is not defined let b = 10; console.log(b); //=>在JS中当前行代码报错,会中断主线程的渲染(下面代码将不再执行) // throw new Error(''):手动抛出一个异常错误,目的就是让后面代码不再执行 // 如果上面代码报错,不想让期影响后面的代码,我们需要做异常捕获:try catch finally try { console.log(a); } catch (e) { //=>错误信息 // console.log(e.message); } let b = 10; console.log(b);
* Promise.prototype * then:设置成功或者失败后执行的方法(成功或者失败都可以设置,也可以只设置一个) * pro.then([success],[error]) * pro.then([success]) * pro.then(null,[error]) * catch:设置失败后执行的方法 * finally:设置不论成功还是失败都会执行的方法(一般不用) let promiseExamp = new Promise((resolve, reject) => { setTimeout(() => { let ran = Math.random(); ran < 0.5 ? reject(ran) : resolve(ran); }, 1000); }); promiseExamp.then(result => { console.log('成功: ' + result); }); promiseExamp.catch(error => { console.log('失败: ' + error); }); promiseExamp.finally(x => { console.log('哈哈'); });
//=>then(onResolve,onReject)
==>执行THEN/CATCH/FINALLY返回的结果是一个全新的PROMISE实例,所以可以链式写下去;下一个THEN中哪个方式会被执行,由上一个THEN中某个方法执行的结果来决定
==>上一个THEN中某个方法的返回值会传递给下一个THEN的某个方法中
new Promise((resolve, reject) => { // resolve(100); //=>把第一个PROMISE实例的VALUE值改为100/-100 reject(-100); }).then(result => { console.log(result); return result * 10; //=>THEN中RETURN的结果相当于把当前这个新的PROMISE实例中的VALUE值改为返回值 }, err => { console.log(err); return err / 10; }).then(A => { console.log('A:' + A); }, B => { console.log('B:' + B); }).then(C => { }, D => { });
如果当前PROMISE实例的状态确定后,都会到对应的THEN中找方法,如果THEN中没有对应的这个方法,则会向下顺延
THEN(onFulfilled) THEN(null,onRejected) new Promise((resolve, reject) => { reject(-100); }).then(A => { console.log(A); return A * 10; }).catch(B => { console.log(B); //=>-100 return B * 10; }); new Promise((resolve, reject) => { resolve(100); }).then(A => { console.log(AAAAA); //=>执行报错,让.THEN创建的PROMISE实例变为失败状态,并且把报错的原因修改此PROMISE的VALUE值 return A * 10; }).catch(B => { console.log(B); //=>ReferenceError: AAAAA is not defined return '@'; }).then(C => { console.log(C); //=>'@' });
new Promise((resolve, reject) => { resolve(); }).then().catch(x => { console.log(1); }).then(x => { console.log(2); //=>OK }).then(x => { console.log(3); //=>OK }).catch(x => { console.log(4); }).then(x => { console.log('AAA'); //=>OK console.log(AAA); //=>报错 }).catch().then(null, x => { console.log(5); //=>OK });
let pro1 = new Promise((resolve, reject) => { setTimeout(() => { let ran = Math.random(); ran < 0.5 ? reject(ran) : resolve(ran); }, 1000); }); let pro2 = pro1.then(result => { console.log(`PRO1:SUCCESS`); }, error => { console.log(`PRO1:ERROR`) }); let pro3 = pro2.then(result => { console.log(`PRO1:SUCCESS`); }, error => { console.log(`PRO1:ERROR`) });
解决AJAX回调地狱
function queryBase() { return new Promise(resolve => { $.ajax({ url: '/baseInfo?name=zhanglu', success: result => { resolve(result); } }); }); } function queryScore(scoreId) { return new Promise(resolve => { $.ajax({ url: '/score?id=' + scoreId, success: result => { resolve(result); } }); }); } function queryChinese(chinese) { return new Promise(resolve => { $.ajax({ url: '/paiming?chin=' + chinese, success: result => { resolve(result); } }); }); } queryBase().then(baseInfo => { let scoreId = baseInfo.scoreId; //=>THEN方法中如果返回的是一个PROMISE实例,则当前返回实例的成功或者失败状态,影响着下一个THEN中哪个方法会被触发执行;如果返回的是非PROMISE实例,则看当前方法执行是否报错,来决定下一个THEN中哪个方法执行; return queryScore(scoreId); }).then(scoreInfo => { let chinese = scoreInfo.chinese; return queryChinese(chinese); }).then(pai => { console.log('排名是:' + pai); }); */ queryBase().then(baseInfo => queryScore(baseInfo.scoreId)) .then(scoreInfo => queryChinese(scoreInfo.chinese)) .then(pai => { console.log('排名是:' + pai); }); */ async function func() { let baseInfo = await queryBase(); let scoreInfo = await queryScore(baseInfo.scoreId); let pai = await queryChinese(scoreInfo.chinese); //.... } func(); */
解决AJAX并行
function ajax1() { return new Promise(resolve => { $.ajax({ url: '/api1', success: resolve }); }); } function ajax2() { return new Promise(resolve => { $.ajax({ url: '/api2', success: resolve }); }); } function ajax3() { return new Promise(resolve => { $.ajax({ url: '/api3', success: resolve }); }); } Promise.all([promise1,promise2,...]):ALL中存放的是多个PROMISE实例(每一个实例管理者一个异步操作),执行ALL方法返回的结果是一个新的PROMISE实例"PROA" //=>当所有PROMISE实例的状态都为Fulfilled的时候(成功),让PROA的状态也变为Fulfilled,并且把所有PROMISE成功获取的结果,存储为成为一个数组(顺序和最开始编写的顺序一致)“result=[result1,result2,...]”,让PROA这个数组的VALUE值等于这个数组 //=>都成功(PROA状态是FUFILLED)才会通知THEN中第一个方法执行,只要有一个失败(PROA状态是REJECTED),就会通知THEN中第二个方法或者CATCH中的方法执行 Promise.all([ajax1(), ajax3(), ajax2()]).then(results => { //=>results:[result1,result3,result2] }); Promise.race([ajax1(), ajax3(), ajax2()]).then(result => { //=>看哪一个PROMISE状态最先处理完(成功或者失败),以最先处理完的为主 });
相关文章推荐
- 前端JS基础知识复习笔记(18)---AXIOS
- 前端项目中常用es6知识总结 -- Promise逃脱回调地狱
- JS基础复习(三)三分钟带你手写一个带promise的简易Ajax请求
- Java中的面试题 [6] --- Java前端知识、模板、css、jsp、ajax、JavaScript、vue.js等
- 【前端学习-字符串】js基础学习笔记
- 笔记 - JS易忘基础知识(一)(ECMAScript基础)
- j2ee学习笔记之前端(js、jQuery、html、html5、webService、ajax、css)—— 一直会补充
- 笔记13--js基础知识-函数
- 【知识笔记】前端JS、逻辑层接口、后端SQL之间的调用关系
- 弄一个ajax笔记方便查询-基础知识篇
- Java基础知识复习笔记(一)
- 前端学习笔记--jQuery--基础知识--事件篇
- 前端知识学习----JS基础语法(1)
- [JS复习] JS 基础知识
- 4 HTML&JS等前端知识系列之Dom的基础
- AJAX基础知识学习笔记
- web前端面试中常见的js基础又实用的知识回顾
- 【前端学习-语法-字面量】js基础学习笔记
- 前端js基础理论知识(二运算符,条件语句)
- 前端js基础理论知识(四 作用域,string对象,DOM基础 节点 属性 方法 设置 获取)