回调:完成通知你就是回调,优于轮询
promise
用同步代码的方式去写异步代码
一个请求
$.ajax({
url: host+'list',
dataType: 'json'
}).then(
(res)=>{console.log('success')},
(err)=>{console.log('fail')},
)
const host = 'http://localhost:8888/'
let p = new Promise((resolve,reject)=>{
$.ajax({
url: host+'list',
dataType: 'json',
success(json){
resolve(json);
},
error(err){
reject(err);
}
});
});
p.then(
json=>{
alert('成功')
console.log(json)
},
err=>{
alert('失败')
console.log(err)
});
多个请求
let p = new Promise((resolve,reject)=>{
$.ajax({
url: host+'list',
dataType: 'json',
success(json){
resolve(json);
},
error(err){
reject(err);
}
});
});
let p1 = new Promise((resolve,reject)=>{
$.ajax({
url: host+'getlunbo',
dataType: 'json',
success(json){
resolve(json);
},
error(err){
reject(err);
}
});
});
let p2 = new Promise((resolve,reject)=>{
$.ajax({
url: host+'newsList',
dataType: 'json',
success(json){
resolve(json);
},
error(err){
reject(err);
}
});
});
Promise.all([p,p1,p2]).then(
arr=>{
let [j1,j2,j3] = arr;
alert('成功')
console.log(j1,j2,j3)
},
err=>{
alert('失败')
})
Promise.all 与操作 所有的都成功 多个请求(最佳)
Promise.all([
$.ajax({url: host+'list', dataType: 'json'}),
$.ajax({url: host+'newsList', dataType: 'json'}),
$.ajax({url: host+'getlunbo', dataType: 'json'})
]).then(
arr=>{
let [j1,j2,j3] = arr;
console.log(j1,j2,j3);
}, err=>{
alert('fail')
})
Promise.race 或操作 只要一个成功 多个请求(最佳)
- promise解除异步操作
- 局限:带逻辑的异步操作麻烦,后面请求需要依赖前面请求的,promise无效
axios
axios.defaults.baseURL = 'http://localhost:8888/'
axios.get('list')
.then(res=>{
console.log(res)
})
.catch(err=>{
console.log(err)
})
let q1 = axios.get('list');
let q2 = axios.get('getlunbo');
let q3 = axios.get('newsList');
axios.all([q1,q2,q3])
.then(axios.spread((req1,req2,req3)=>{
console.log(req1,req2,req3)
}))
.catch(err=>{
console.log(err)
})
generator 生成器
能暂停
箭头函数没有生成器
function *show(){
console.log(1);
let n = yield 55;
console.log(2+n);
return 66;
}
let gen = show();
let res1 = gen.next();
console.log(res1)
let res2 = gen.next(12);
console.log(res2)
/* 1
{ value: 55, done: false }
14
{ value: 66, done: true } */
generator+promise配合
- 外来的runner不统一
- generator函数不能写成=>
解决请求的依赖
function *show(){
let data1 = yield $.ajax({url: host+'list', dataType: 'json'});
if(data1.lenght>0){
let data2 = yield $.ajax({url: host+'newsList', dataType: 'json'});
}else{
let data2 = yield $.ajax({url: host+'getlunbo', dataType: 'json'});
}
}
runner(show);
async/await
人类2019.1.1日:javascript异步终极解决方案
支持所有的函数,包括箭头函数,匿名函数
https://segmentfault.com/a/1190000007535316
async function show(){
try{
/* let data1 = await $.ajax({url: host+'list', dataType: 'json'});
let data2 = await $.ajax({url: host+'getlunbo', dataType: 'json'});
let data3 = await $.ajax({url: host+'newsList', dataType: 'json'}); */
let data1 = await axios.get('list');
let data2 = await axios.get('getlunbo');
let data3 = await axios.get('newsList');
console.log(data1,data2,data3);
}catch(e){
console.log(e);
}
}
show();