异步编程
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执行需要满足两个条件
- 主进程必须是空闲的状态,如果到时间了,主进程不空闲也不会执行你的回掉函数
- 这个回掉函数需要等到插入异步队列时前面的异步函数都执行完了,才会执行
执行顺序就是宏任务->微任务队列->宏任务队列
1,pomise是同步任务,他的回调是异步任务
2,async关键字函数会返回一个promise对象,如果函数里面没有await关键字,那就相当于一个普通函数,await关键字后面的代码就属于异步任务。
推荐阅读
- 事件代理
- 数组常用方法一
- python青少年编程比赛_第十一届蓝桥杯大赛青少年创意编程组比赛细则
- HTML基础--基本概念--跟着李南江学编程
- 我的软件测试开发工程师书单
- 芯灵思SinlinxA33开发板Linux内核定时器编程
- 关于响应式编程的十个问题
- iOS-Swift-map|iOS-Swift-map filter reduce、函数式编程
- 零基础学习Python作业本(13)
- 网络编程基础--HTTP