目录
在JavaScript中,Promise
对象是用于处理异步操作的核心工具。特别是当我们需要同时处理多个异步操作时,Promise.all()
方法非常有用,它可以将多个Promise
对象合并成一个新的Promise
,并且只有当所有的Promise
都成功时,才会执行成功的回调,否则会执行失败的回调。
本例说明:
在本例中,我们通过调用axios
发送多个请求,获取不同城市的天气信息,并通过Promise.all()
方法并行处理所有请求。这种方法适合用在我们需要同一时间显示多个请求结果的场景。
代码说明
HTML部分(文件名:index.html
)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Promise的all方法</title>
</head>
<body>
<ul class="my-ul"></ul>
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
<script>
/**
* 目标:掌握Promise的all方法作用,和使用场景
* 业务:当我需要同一时间显示多个请求的结果时,就要把多请求合并
* 例如:默认显示"北京", "上海", "广州", "深圳"的天气在首页查看
* code:
* 北京-110100
* 上海-310100
* 广州-440100
* 深圳-440300
*/
// 深圳
const city1 = axios({url: 'http://hmajax.itheima.net/api/weather',params: {city: '440300'}})
// 广州
const city2 = axios({url: 'http://hmajax.itheima.net/api/weather',params: {city: '440100'}})
// 上海
const city3 = axios({url: 'http://hmajax.itheima.net/api/weather',params: {city: '310100'}})
// 北京
const city4 = axios({url: 'http://hmajax.itheima.net/api/weather',params: {city: '110100'}})
// 使用Promise.all来并行请求所有城市的天气数据
const p = Promise.all([city1, city2, city3, city4])
// 如果所有请求成功,则处理返回结果
p.then(result => {
console.log(result);
const cityStr = result.map(item => {
return `<li>${item.data.data.area}-----${item.data.data.windPower}-----${item.data.data.windDirection}</li>`
}).join('')
document.querySelector('.my-ul').innerHTML = cityStr
}).catch(error => {
console.dir(error);
})
</script>
</body>
</html>
代码解析:
-
引入外部资源:
- 使用了
axios
库来发送异步请求,获取天气数据。axios
是一个基于Promise
的HTTP客户端,可以用于浏览器和Node.js。
- 使用了
-
四个
axios
请求:city1
,city2
,city3
,city4
分别是对深圳、广州、上海和北京的天气信息请求。- 每个请求都返回一个
Promise
对象。
-
Promise.all
方法:Promise.all([city1, city2, city3, city4])
将所有的Promise
对象合并成一个新的Promise
。Promise.all
只有在所有Promise
都成功时才会执行then
回调,否则执行catch
回调。
-
处理返回结果:
- 一旦所有请求成功,
then
方法会被触发,result
数组包含了每个请求的响应数据。 - 使用
map
方法遍历返回结果,并将每个城市的天气信息插入到<ul>
标签中。
- 一旦所有请求成功,
-
错误处理:
- 如果其中任何一个请求失败,
catch
回调会捕获错误并打印错误信息。
- 如果其中任何一个请求失败,
运行结果:
当你打开这个HTML页面时,浏览器会自动向服务器发送请求获取深圳、广州、上海和北京的天气信息。当所有请求都成功返回数据时,页面上会显示这些城市的天气信息:
- 城市名称
- 风力(windPower)
- 风向(windDirection)
结果会以<ul>
列表的形式显示在页面上,每个城市的数据都会展示为一个<li>
项。
总结:
Promise.all()
是一个非常有用的方法,尤其在需要并行处理多个异步操作时,可以将多个异步操作的结果汇总到一起。- 在实际开发中,使用
Promise.all()
能够提高性能,并且使得代码更加简洁和可读。