标签:listen 城市列表 func 一起 避免 Nid end 响应 好的
<script>
document.addEventListener("click", function(){
console.log("你点击了我");
});
</script>
<script>
ajax("https://www.baidu.com", {
success : function(data){
// 必须在ajax请求成功的时候才会执行这个成功函数回调函数
console.log(data);
}
});
</script>
<script>
setInterval(function () {
// 没过一秒钟执行一次
console.log("hello");
}, 1000);
setTimeout(function () {
// 页面加载之后延迟一秒后执行
console.log("hello");
}, 1000);
</script>
一般情况下,我们一次调用API就可以完成请求。
有些情况我们需要多次调用服务器API,就会形成一个链式调用,比如为了完成一个功能,我们需要调用API1,API2,API3,依次按照顺序进行调用,这个时候就会出现回调地狱的问题。
new Promise( ( resolve, reject ) => {
resolve("成功");
} ).then(
res => {
console.log(res);
},
error => {
console.log(error);
}
);
resolve作用是将Promise对象的状态从“未完成”变为“成功”(即从 pending 变为 resolved),在异步操作成功时调用,并将异步操作的结果,作为参数传递出去;reject作用是,将Promise对象的状态从“未完成”变为“失败”(即从 pending 变为 rejected),在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。
promise有三个状态:
当promise状态发生改变,就会触发then()里的响应函数处理后续步骤;
promise状态一经改变,不会再变。
Promise状态改变,只有两种情况
从pending变为fulfilled
从pending变为rejected
new Promise(resolve => {
setTimeout(() => {
resolve(‘hello‘)
}, 2000)
}).then(res => {
console.log(res)
})
new Promise(resolve => {
setTimeout(() => {
resolve(‘hello‘)
}, 2000)
}).then(val => {
console.log(val) // 参数val = ‘hello‘
return new Promise(resolve => {
setTimeout(() => {
resolve(‘world‘)
}, 2000)
})
}).then(val => {
console.log(val) // 参数val = ‘world‘
})
结论:promise作为队列最为重要的特性,我们在任何一个地方生成了一个promise队列之后,我们可以把他作为一个变量传递到其他地方。
Promise.all([p1, p2, p3])用于将多个promise实例,包装成一个新的Promise实例,返回的实例就是普通的promise
它接收一个数组作为参数
数组里可以是Promise对象,也可以是别的值,只有Promise会等待状态改变
当所有的子Promise都完成,该Promise完成,返回值是全部值得数组
有任何一个失败,该Promise失败,返回值是第一个失败的子Promise结果
//切菜
function cutUp(){
console.log(‘开始切菜。‘);
var p = new Promise(function(resolve, reject){ //做一些异步操作
setTimeout(function(){
console.log(‘切菜完毕!‘);
resolve(‘切好的菜‘);
}, 1000);
});
return p;
}
//烧水
function boil(){
console.log(‘开始烧水。‘);
var p = new Promise(function(resolve, reject){ //做一些异步操作
setTimeout(function(){
console.log(‘烧水完毕!‘);
resolve(‘烧好的水‘);
}, 1000);
});
return p;
}
Promise.all([cutUp(), boil()])
.then((result) => {
console.log(‘准备工作完毕‘);
console.log(result);
})
let p1 = new Promise(resolve => {
setTimeout(() => {
resolve(‘I\`m p1 ‘)
}, 1000)
});
let p2 = new Promise(resolve => {
setTimeout(() => {
resolve(‘I\`m p2 ‘)
}, 2000)
});
Promise.race([p1, p2])
.then(value => {
console.log(value)
})
常见用法:
异步操作和定时器在一起,如果定时器先触发那告知用户超时
现实中的用法
回调包装成Promise,他有两个显而易见的好处
回调地狱的代码和Promise的代码对比
/***
第一步:找到北京的id
第二步:根据北京的id -> 找到北京公司的id
第三步:根据北京公司的id -> 找到北京公司的详情
目的:模拟链式调用、回调地狱
***/
// 回调地狱
// 请求第一个API: 地址在北京的公司的id
$.ajax({
url: ‘https://www.easy-mock.com/mock/5a52256ad408383e0e3868d7/lagou/city‘,
success (resCity) {
let findCityId = resCity.filter(item => {
if (item.id == ‘c1‘) {
return item
}
})[0].id
$.ajax({
// 请求第二个API: 根据上一个返回的在北京公司的id “findCityId”,找到北京公司的第一家公司的id
url: ‘https://www.easy-mock.com/mock/5a52256ad408383e0e3868d7/lagou/position-list‘,
success (resPosition) {
let findPostionId = resPosition.filter(item => {
if(item.cityId == findCityId) {
return item
}
})[0].id
// 请求第三个API: 根据上一个API的id(findPostionId)找到具体公司,然后返回公司详情
$.ajax({
url: ‘https://www.easy-mock.com/mock/5a52256ad408383e0e3868d7/lagou/company‘,
success (resCom) {
let comInfo = resCom.filter(item => {
if (findPostionId == item.id) {
return item
}
})[0]
console.log(comInfo)
}
})
}
})
}
})
// Promise 写法
// 第一步:获取城市列表
const cityList = new Promise((resolve, reject) => {
$.ajax({
url: ‘https://www.easy-mock.com/mock/5a52256ad408383e0e3868d7/lagou/city‘,
success (res) {
resolve(res)
}
})
})
// 第二步:找到城市是北京的id
cityList.then(res => {
let findCityId = res.filter(item => {
if (item.id == ‘c1‘) {
return item
}
})[0].id
findCompanyId().then(res => {
// 第三步(2):根据北京的id -> 找到北京公司的id
let findPostionId = res.filter(item => {
if(item.cityId == findCityId) {
return item
}
})[0].id
// 第四步(2):传入公司的id
companyInfo(findPostionId)
})
})
// 第三步(1):根据北京的id -> 找到北京公司的id
function findCompanyId () {
let aaa = new Promise((resolve, reject) => {
$.ajax({
url: ‘https://www.easy-mock.com/mock/5a52256ad408383e0e3868d7/lagou/position-list‘,
success (res) {
resolve(res)
}
})
})
return aaa
}
// 第四步:根据上一个API的id(findPostionId)找到具体公司,然后返回公司详情
function companyInfo (id) {
let companyList = new Promise((resolve, reject) => {
$.ajax({
url: ‘https://www.easy-mock.com/mock/5a52256ad408383e0e3868d7/lagou/company‘,
success (res) {
let comInfo = res.filter(item => {
if (id == item.id) {
return item
}
})[0]
console.log(comInfo)
}
})
})
}
标签:listen 城市列表 func 一起 避免 Nid end 响应 好的
原文地址:https://www.cnblogs.com/xfy196/p/12595566.html