用Promise对象, 解决回调地狱:
1. 先封装一个Promise请求函数
2. 在第一个promise的.then里面, 将第二个异步任务得到的promise, 通过return返回出来;
3. 在第一个.then()的后面, 就可以设置第二个promise的.then()函数了;
4. 以此类推, 通过.then()的链式调用, 解决回调地狱问题. 且.then()一定会按顺序执行;
// 1. 用promsie封装请求
function ajax(path, params, method = "GET") {
let urlStr = `https://restapi.amap.com/v3${path}?key=278252e0c1e253f6365ce9a4926f015d&`;
if (params) urlStr += params;
return new Promise(resolve => {
fetch(urlStr, {
method,
})
.then(resp => resp.json())
.then(data => {
resolve(data);
});
});
}
但是这种方式依然不够
// 2. 利用封装好的ajax请求, 开始实现需求.
// ------ 请求城市信息
ajax("/ip")
.then(({ city }) => {
// ------ 根据城市, 请求天气信息
return ajax("/weather/weatherInfo", `city=${city}&extensions=all`);
})
.then(data => {
// ------- 根据天气数据, 查询出行建议
return ajax("/ip");
})
.then(data => {});
简洁, 所以, 终极解决方案, 就是async+await方案.