前言
“JS基于单线程事件循环的概念”,回调函数不会立即执行。事件轮询用于检测事件是否被执行。获得结果后,将结果放入回调函数的参数中,然后将回调函数添加到事件队列中执行。
同时,我还谈到了回调函数:
第一个是“回调地狱”,因为异步回调函数的特点:回调函数是异步函数的参数,层层嵌套。如果嵌套太多,代码逻辑会变得混乱,错误无法捕捉和处理好(只能在回调函数内部尝试try catch)。
二是回调的实现方式不符合自然语言的线性思维模式,不容易被理解。
三是控制反转(控制权在于别人的代码)。如果异步函数是别人提供的库,我们传入回调函数,除了调用回调函数,我们无法知道异步函数做了什么。
func 1(()={ func 2(()={ func 3(()={ func 4(()={ try }.}捕获(错误).}})});});});一、承诺原则
首先,promise的中文翻译是“promise”,这是JavaScript的一个对象,表示Promise最终会返回一个结果,无论成功还是失败。承诺有三种状态:待定、已满和拒绝。无极的设计是原子的。一旦状态从待定更改为已满或已拒绝,就不能更改。
Varpromise1=newpromise((解析,拒绝)={console.log ('promise构造函数将立即执行');settimeout(function(){ if(true){ resolve(' complete ');} else { reject(' failed ');}}, 1000);})promise1 .然后((结果)={//do somethingconsole.log(结果);return 1//return Promise . resolve(1);//返回成功的承诺实例//返回Promise.reject('错误');//返回解析被拒绝的Promise实例})。然后((结果)={//。然后()方法将返回一个承诺,调用的参数是前一个承诺的返回值或解析值。//做其他事情thingsconsole.log(结果);抛出新错误('错误')//抛出错误是隐式拒绝})。catch((错误)={//Catch错误控制台。日志(错误)})。然后(()={//可以继续执行!}).finally(()={//总是做一些事sconssole . log(' finally!')})第二,无极的优点
1.链式呼叫
使用then方法后,Promise将返回一个新的Promise对象,这便于我们传输状态数据。同时,链式写作接近同步写作,更符合线性思维。
2.错误捕获
相比于回调函数的错误无法从外部捕捉的问题,Promise可以为一系列异步调用提供错误处理。
3.控制反转和反转
由于第三方提供的异步函数,无法保证回调函数将如何执行,但Promise的特性可以保证异步函数只能解析一次,代码始终异步执行。
4.Promise.all和Promise.race可以用来解决Promise总是未定和平行Promise嵌套的问题
三、《无极》的缺点
1.每一个。那么()就是一个独立的作用域
添加了很多。然后()方法会创建很多独立的作用域,所以您只能通过包装函数作用域的一层闭包来共享状态数据。
2.无法取消单个。然后()
当有任何语句执行错误时。那么在Promise链中的()方法,整个Promise链的执行将不会被中断,尽管catch方法进行了错误处理。
3.无法知道进度
由于承诺只能从待定变为已完成或已拒绝,因此无法知道待定阶段的进度。
第四,承诺申请
//承诺封装ajaxfunction fetch(方法、网址、数据){返回新承诺((解析,拒绝)={ var xhr=new XMLHttpRequest();定义变量方法=方法| | ' GETvar数据=data | | nullxhr.open(方法、url、true);xhr。onreadystatechange=function(){ if(xhr。状态===200 xhr。readystate===4){ resolve(xhr。response text);} else { reject(xhr。response text);}}xhr.send(数据);})}//使用fetch('GET ','/some/url.json ',null).然后(结果={console.log(结果);})//封装首先出现开发错误风格回调函数读取文件(网址){ 0返回新承诺(解析,拒绝)={fs.readFile(url,' utf8 ',(err,data)={ if(err){ reject(err)};返回;}解析(数据)}) })五、总结
承诺是ES6提出的简化异步流程控制新规范,强调异步任务的完成状态且具有原子性,这使得我们的代码更容易追踪和维护承诺在事件轮询中属于异步事件队列中的微任务,而微任务总是一次性全部执行,而宏任务是每轮轮询执行一个。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。