Javascript任务执行方式,分为同步执行(synchronous)和异步执行(asyncchronous)。异步编程方案的根源是回调函数(由调用者定义,交给执行者执行的函数就是回调函数)。Js线程在某个时刻发起异步调用,代码继续向后执行其他任务。异步线程会单独执行异步任务,任务执行完成后,任务的回调会放入消息队列中。Js主线程完成所有任务后,会依次执行消息队列中的任务。Promise的基本用法使用promise封装一个ajax方法functionajax(url){returnnewPromise((resolve,reject)=>{letxhr=newXMLHttpRequest();xhr.open('GET',url);//setrequestTypexhr.responseType='json';//请求完成后得到一个json对象xhr.onload=function(){if(this.status===200){resolve(this.response)}else{reject(newError(this.statusText))}}xhr.send()})}测试代码ajax('localfile').then((res)=>{console.log(res);},(err)=>{console.log(err)})promise调用,避免进入回调地狱,借助then方法,尽可能保证任务尽可能平坦。then方法返回一个全新的promise对象,每个then方法返回前一个then方法的promise对象,在状态清除后添加一个回调。then方法将按顺序执行。如果then方法返回一个普通值,它将作为当前then方法返回的promise的值。下一个then方法参数是,如果没有返回任何内容,则它是未定义的。综上所述,promise对象的then方法返回了一个全新的promise对象。其背后的then方法是为之前的then返回的promise注册回调。前面的then方法中回调函数的返回值会作为后面的then方法的返回参数。return是一个promise,then方法的回调会等待它结束。promise执行过程中发生的失败或异常会在reject中被捕获,但建议使用catch来捕获,不要漏掉任何一个异常promise的静态方法promise.resolve()。如果传入一个Promise对象,Promise.resolve方法原样返回,如果传入一个值,则将该值作为返回值返回。如果传入一个与Promise相同的then方法的对象,就相当于实现了一个thenable接口Promise.resolve会将这个对象作为一个Promise来执行Promise.resolve({then:function(onFulfilled,onRejected){onFulfilled('foo')}}).then(function(value){console.log(value)})Promise.reject无论传入什么参数,都会作为Promise失败的原因。异步执行顺序这个问题涉及到js事件循环,首先js事件有两种,宏任务和微任务。宏任务包括setTimeout、script、setInterval,微任务包括promise中的then方法,node.js中的process.nextTick分别理解它们的特点:setTimeOut不是直接把你的回调函数放到上面说的异步队列中,而是在之后定时器时间到,将回调函数放入执行异步队列,属于异步代码。队列具有先进先出的特点。排队的先执行。setTimeout的执行需要满足两个条件。主进程必须空闲。如果时间到了,主进程如果不空闲,是不会执行你的回调函数的。这个回调函数插入异步队列时需要等到前面的异步函数都执行完,然后执行顺序是宏任务->微任务队列->宏任务队列关于promise,async/await1,promise是一个同步任务,它的回调是异步任务2、async关键字函数会返回一个promise对象。如果函数中没有await关键字,就相当于一个普通的函数,await关键字后面的代码就是一个异步任务。
