Javascript工作执行模式,分同步执行(synchronous)和异步执行(asyncchronous)。
异步编程计划的基本是回调函数(调用者定义,交给执行者执行的函数就是回调函数)
Js线程在某一刻发动了一个异步调用,代码持续向后执行其余工作,异步线程会独自执行异步工作,工作执行之后会将工作的回调放到音讯队列。Js主线程在实现所有工作过后,会顺次执行音讯队列中的工作。
Promise根本用法
用promise封装一个ajax办法
function ajax (url){
return new Promise((resolve,reject)=>{
let xhr = new XMLHttpRequest();
xhr.open('GET',url); // 设置申请类型
xhr.responseType = 'json'; //申请实现后拿到一个json对象
xhr.onload = function() {
if(this.status === 200){
resolve(this.response)
}else{
reject(new Error(this.statusText))
}
}
xhr.send()
})
}
测试代码
ajax('本地文件').then((res)=>{
console.log(res);
},(err)=>{
console.log(err)
})
promise调用,防止进入回调天堂,借助于then办法,尽可能保障工作扁平化.
then办法返回一个全新的promise对象,每一个then办法都是为上一个then办法返回的promise对象去增加状态明确过后的回调。then办法会顺次执行,如果then办法返回的是一个一般值,将作为以后then办法返回的promise的值,下一个then办法参数就是,如果什么都不返回,就是undefinde
。
总结来说
promise对象的then办法返回一个全新的promise对象
前面的then办法就是在为上一个then返回的promise注册回调
后面then办法中回调函数的返回值会作为前面then办法回到的参数
如果回调中返回的是promise,那前面then办法的回调会期待他的完结
reject
中会捕捉promise执行中呈现的失败或者异样,然而举荐应用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/await
1,pomise是同步工作,他的回调是异步工作
2,async关键字函数会返回一个promise对象,如果函数外面没有await关键字,那就相当于一个一般函数,await关键字前面的代码就属于异步工作。
发表回复