几种异步请求的区别、简单写法(回调、Promise、generator)

几种异步请求的区别、简单写法

  • 回调
  • Promise-------适合读取一堆数据
  • generator-----适合掺杂逻辑处理----不能写成箭头函数的形式

一次性获取一堆数据时

回调–层层嵌套

// 回调
$.ajax({
    url:url,
    dataType:"json",
    success(data1){
        $.ajax({
            url:url2,
            dataType:"json",
            success(data2){
                $.ajax({
                    url:url3,
                    dataType:"json",
                    success(data3){
                        //数据获取成功
                    },
                    error(){
                        console.log("错了")
                    }
                })
            },
            error(){
                console.log("错了")
            }
        })
    },
    error(){
        console.log("错了")
    }
})

Promise

Promise.all([
    $.ajax({url:url1,dataType:"json"});
    $.ajax({url:url2,dataType:"json"});
    $.ajax({url:url3,dataType:"json"});
]).then(result=>{
   // 数据获取成功,可以干点别的事了。。。
},err=>{
    console.log(err)
})

generator

runner(function *(){
    let data1 = yield $.ajax(url:url, dataType:"json");
    let data2 = yield $.ajax(url:url, dataType:"json");
    let data3 = yield $.ajax(url:url, dataType:"json");

    //结束
})

带逻辑时,比如先获取用户,再根据用户是否是VIP来判断获取下一个

回调写法

// 普通回调
$.ajax({url:用户,dataType:"json",success(data1){
        if(data1.name == VIP){
            $.ajax({url:VIP,dataType:"json",success(data1){
                    // 生成列表
                },
                error(){
                   // 错了
                }
            })
        } else {
            $.ajax({url:VIP,dataType:"json",success(data1){
                    //生成列表
                },
                error(){
                  // 错了
                }
            })
        }
    },
    error(){
        // 错了
    }
})

Promise(逻辑嵌套时,还没有普通回调方便)

Promise.all([
    $.ajax({url:用户,dataType:"json"});
]).then(result=>{
    let userdata = result[0];
   if(userdata == VIP){
       Promise.all([
           $.ajax({url:VIP,dataType:"json"});
       ]).then(results => {
           // 生成列表。。。
       },err=>{

       })
   } else {
       Promise.all([
           $.ajax({url:普通,dataType:"json"});
       ]).then(results => {
          // 生成列表。。。
       },err=>{

       })
   }
},err=>{
    console.log(错了)
})

generator 超适合逻辑处理

runner(function *(){
    var data1 = yield $.ajax({url:url, dataType:"json"});
    if(data1.type == "VIP"){
        let items =  yield $.ajax({url:VIP, dataType:"json"});
    }else{
        let items2 =  yield $.ajax({url:普通, dataType:"json"});
    }
    // 生成列表。。。
})

附带:generator写法中用到的runner.js

function runner(_gen){
  return new Promise((resolve, reject)=>{
    var gen=_gen();

    _next();
    function _next(_last_res){
      var res=gen.next(_last_res);

      if(!res.done){
        var obj=res.value;

        if(obj instanceof Promise){
          obj.then((res)=>{
            _next(res);
          }, (err)=>{
            reject(err);
          });
        }else if(typeof obj=='function'){
          if(obj.constructor.toString().startsWith('function GeneratorFunction()')){
            runner(obj).then(res=>_next(res), reject);
          }else{
            _next(obj());
          }
        }else{
          _next(obj);
        }
      }else{
        resolve(res.value);
      }
    }
  });
};

可通过npm 下载,包中的index.js 就是代码中用到的runner.js用于配合generator使用,很方便
地址:npm i yield-runner-blue

发布了18 篇原创文章 · 获赞 0 · 访问量 386

猜你喜欢

转载自blog.csdn.net/sinat_41904410/article/details/99004146