目录
JavaScript 的执行环境是单线程。
所谓单线程,是指 JS 引擎中负责解释和执行 JavaScript 代码的线程只有一个,也就是一次只能完成一项任务,这个任务执行完后才能执行下一个,它会「阻塞」其他任务。这个任务可称为主线程。
异步模式可以一起执行多个任务。
常见的异步模式有以下几种:
-
定时器
-
接口调用
-
事件函数
js 中常见的接口调用方式,有以下几种:
-
原生 ajax
-
基于 jQuery 的 ajax
-
Fetch
-
Promise
-
axios
多次异步调用的依赖分析
-
多次异步调用的结果,顺序可能不同步。
-
异步调用的结果如果存在依赖,则需要嵌套。
在 ES5 中,当进行多层嵌套回调时,会导致代码层次过多,很难进行维护和二次开发。而且会导致回调地狱的问题。ES6 中的 Promise 就可以解决这两个问题。
什么是 Promise
ES6 中的 Promise 是异步编程的一种方案。从语法上讲,Promise 是一个对象,它可以获取异步操作的消息。
Promise 对象, 可以将异步操作以同步的流程表达出来。
使用 Promise 主要有以下好处:
-
可以很好地解决回调地狱的问题(避免了层层嵌套的回调函数)。
-
语法非常简洁。Promise 对象提供了简洁的 API,使得控制异步操作更加容易。
回调地狱的举例
假设买菜、做饭、吃饭都是异步的。
但真实的场景中,实际的操作流程是:买菜成功之后,才能开始做饭。做饭成功后,才能开始吃饭。这里面就涉及到了多层嵌套调用,也就是回调地狱。
Promise 的基本用法
使用 new
实例化一个 Promise 对象,Promise 的构造函数中传递一个参数。这个参数是一个函数,该函数用于处理异步任务。
并且传入两个参数:resolve
和 reject
,分别表示异步执行成功后的回调函数和异步执行失败后的回调函数。
通过 promise.then()
处理返回结果。这里的 promise
指的是 Promise 实例。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Promise 的基本用法</title>
</head>
<body>
<script type="text/javascript">
const runAsync = () => {
// 第一步:model层的接口封装
let promise = new Promise((resolve, reject) => {
// 这里做异步任务(比如 ajax 请求接口,这里暂时用定时器代替)
setTimeout(() => {
// 接口返回的数据
const data = { code: 200, msg:'hello world' }
if (data.code === 200) {
// 接口请求成功时调用
resolve(data)
} else {
// 接口请求失败时调用
reject({ code: 500, msg: 'network error' })
}
}, 1000)
})
// 第二步:业务层的接口调用。这里的 res 就是 从 resolve 和 reject 传过来的,也就是从接口拿到的数据
.then(res => {
// 从 resolve 获取正常结果
console.log(res)
})
.catch(res => {
// 从 reject 获取异常结果
console.log(res)
})
return promise
}
runAsync()
</script>
</body>
</html>
上方代码中,当从接口返回的数据data.code
的值不同时,可能会走 resolve,也可能会走 reject,这个由你自己的业务决定。