异步编程
一、js是单线程
所谓单线程是指一次只能完成一个任务。如果有多个任务,就必须排队等候,只有等前面得一个任务完成,才能继续后面得一个任务。单线程只要期中有一个任务耗时长,后面得任务都必须排队等着。为了解决这个问题,js将任务得执行模式分为两种分别是 同步和异步
二、同步和异步
先弄清楚一件事情:编程中得同步异步和现实中得同步异步正好相反。
-
同步:连续不间断地执行多个任务,会阻塞主线程。比如console.log()、alert()
-
异步:不连续地执行多个任务,不会阻塞主线程比如:setTimeout()、网络请求、读取本地文件等
console.log(1) setTimeout(()=>{ console.log(2) },1000) console.log(3) ///1 3 2
三、异步编程解决方案
1、回调函数
1、什么是回调函数?
回调函数就是一个被作为参数传递地函数。通俗地说,回调函数就是一个函数,并且是作为参数传递给另一个函数的函数。
2、回调函数的基本用法
案例一:先输出1,然后再打印2.
案例二:简单加法运算,但是有一个条件,传入参数和返回计算结果是异步的。
3、回调函数有什么用?
回调函数是异步编程最基本的方法
ajax(url,res=>{ ///处理逻辑 })
优点:简单、容易理解和实现。
缺点:不利于代码的阅读和维护、尤其是多个回调函数嵌套的情况,如果超过3层嵌套,就容易写出回调地狱代码。此外、它不能使用try catch 捕获异常,也不能直接return。
ajax(url1,res=>{ ///处理逻辑 ajax(url2,res=>{ //处理逻辑 ajax(url3,=>{ ///处理逻辑 …… }) }) })
2、promise
promise本意是承诺、许诺。在程序中的意思是承诺过一段时间后给一个结果,
1、promise的3中状态
- pending:等待状态(又叫进行中)
- fulfilled/resolved:成功状态
- rejected:失败状态
2、promise的基本用法
promise对象是全局对象,可以理解胃一个类,参数是一个回调函数,他有俩个参数方法,分别是resolve和rejecte
- resolve的作用:将promise对象的状态从等待中(pending)变成成功状态(fulfilled)。在异步操作成功的时候调用,并且异步操作结果作为参数传递出去
- reject的作用:将promise对象的状态从等待中(pending)变成失败状态(rejected)在异步操作失败时调用,并将异步报出的错误作为参数传递出去。
3、promise的实例方法
-
promise 对象有三种状态:pending(等待状态)、resolved/fulfilled(成功状态)、rejected(失败状态)。只有异步操作的结果(要么成功,调用resolve;要么失败调用reject)可以决定当前是哪一个状态,任何其他操作都无法改变这个状态。
-
promise对象的状态改变,只有两种可能:要么从pending->fulfilled;要么pending->rejected。只有这两种情况发生,状态就不会再变了,会一直保持这个结果。
let p =new promise((resolve,reject)=>{ reject('失败')//pending->rejected resolve('成功')//不会执行,因为pending对象一旦改变状态就不会再次改变 }); p.then(res=>{ console.log(res) }).catch(err=>{ console.log(err) })