回调:完成通知你就是回调,优于轮询

promise

用同步代码的方式去写异步代码

一个请求

  1. $.ajax({
  2. url: host+'list',
  3. dataType: 'json'
  4. }).then(
  5. (res)=>{console.log('success')},
  6. (err)=>{console.log('fail')},
  7. )
  1. const host = 'http://localhost:8888/'
  2. let p = new Promise((resolve,reject)=>{
  3. $.ajax({
  4. url: host+'list',
  5. dataType: 'json',
  6. success(json){
  7. resolve(json);
  8. },
  9. error(err){
  10. reject(err);
  11. }
  12. });
  13. });
  14. p.then(
  15. json=>{
  16. alert('成功')
  17. console.log(json)
  18. },
  19. err=>{
  20. alert('失败')
  21. console.log(err)
  22. });

多个请求

  1. let p = new Promise((resolve,reject)=>{
  2. $.ajax({
  3. url: host+'list',
  4. dataType: 'json',
  5. success(json){
  6. resolve(json);
  7. },
  8. error(err){
  9. reject(err);
  10. }
  11. });
  12. });
  13. let p1 = new Promise((resolve,reject)=>{
  14. $.ajax({
  15. url: host+'getlunbo',
  16. dataType: 'json',
  17. success(json){
  18. resolve(json);
  19. },
  20. error(err){
  21. reject(err);
  22. }
  23. });
  24. });
  25. let p2 = new Promise((resolve,reject)=>{
  26. $.ajax({
  27. url: host+'newsList',
  28. dataType: 'json',
  29. success(json){
  30. resolve(json);
  31. },
  32. error(err){
  33. reject(err);
  34. }
  35. });
  36. });
  37. Promise.all([p,p1,p2]).then(
  38. arr=>{
  39. let [j1,j2,j3] = arr;
  40. alert('成功')
  41. console.log(j1,j2,j3)
  42. },
  43. err=>{
  44. alert('失败')
  45. })

Promise.all 与操作 所有的都成功 多个请求(最佳)

  1. Promise.all([
  2. $.ajax({url: host+'list', dataType: 'json'}),
  3. $.ajax({url: host+'newsList', dataType: 'json'}),
  4. $.ajax({url: host+'getlunbo', dataType: 'json'})
  5. ]).then(
  6. arr=>{
  7. let [j1,j2,j3] = arr;
  8. console.log(j1,j2,j3);
  9. }, err=>{
  10. alert('fail')
  11. })

Promise.race 或操作 只要一个成功 多个请求(最佳)

  1. promise解除异步操作
  2. 局限:带逻辑的异步操作麻烦,后面请求需要依赖前面请求的,promise无效

axios

  1. axios.defaults.baseURL = 'http://localhost:8888/'
  2. axios.get('list')
  3. .then(res=>{
  4. console.log(res)
  5. })
  6. .catch(err=>{
  7. console.log(err)
  8. })
  9. let q1 = axios.get('list');
  10. let q2 = axios.get('getlunbo');
  11. let q3 = axios.get('newsList');
  12. axios.all([q1,q2,q3])
  13. .then(axios.spread((req1,req2,req3)=>{
  14. console.log(req1,req2,req3)
  15. }))
  16. .catch(err=>{
  17. console.log(err)
  18. })

generator 生成器

能暂停
箭头函数没有生成器

  1. function *show(){
  2. console.log(1);
  3. let n = yield 55;
  4. console.log(2+n);
  5. return 66;
  6. }
  7. let gen = show();
  8. let res1 = gen.next();
  9. console.log(res1)
  10. let res2 = gen.next(12);
  11. console.log(res2)
  12. /* 1
  13. { value: 55, done: false }
  14. 14
  15. { value: 66, done: true } */

generator+promise配合

  1. 外来的runner不统一
  2. generator函数不能写成=>

解决请求的依赖

  1. function *show(){
  2. let data1 = yield $.ajax({url: host+'list', dataType: 'json'});
  3. if(data1.lenght>0){
  4. let data2 = yield $.ajax({url: host+'newsList', dataType: 'json'});
  5. }else{
  6. let data2 = yield $.ajax({url: host+'getlunbo', dataType: 'json'});
  7. }
  8. }
  9. runner(show);

async/await

人类2019.1.1日:javascript异步终极解决方案
支持所有的函数,包括箭头函数,匿名函数

https://segmentfault.com/a/1190000007535316

  1. async function show(){
  2. try{
  3. /* let data1 = await $.ajax({url: host+'list', dataType: 'json'});
  4. let data2 = await $.ajax({url: host+'getlunbo', dataType: 'json'});
  5. let data3 = await $.ajax({url: host+'newsList', dataType: 'json'}); */
  6. let data1 = await axios.get('list');
  7. let data2 = await axios.get('getlunbo');
  8. let data3 = await axios.get('newsList');
  9. console.log(data1,data2,data3);
  10. }catch(e){
  11. console.log(e);
  12. }
  13. }
  14. show();

异步 - 图1