首頁  >  問答  >  主體

javascript - JS异步编程该怎么写更优雅?

需求很简单:项目的登陆功能通过ajax请求登陆多个系统,如果登陆成功的话清空密码框。
但由于是异步的请求,是否成功的判断都必须写在callback里面,导致重读代码冗余,难道就没有更优雅的写法吗?

代码

function logOn(userName,password){
    //支付系统
    $.ajax({
        url: paymentUrl,
        success: function(data) {
            //判断如果登陆成功就清空密码框
            if(data.success){ clearPassword();} 
        }
    });

    //反洗钱系统
    $.ajax({
        url: amlUrl,
        success: function(data) {
            //判断如果登陆成功就清空密码框        
            if(data.success){ clearPassword();} 
        }
    });
    
    //核心系统
    $.ajax({
        url: coreUrl,
        success: function(data) {
            //判断如果登陆成功就清空密码框        
            if(data.success){ clearPassword();} 
        }
    });    
    
    //本来想定义外部变量来判断,统一处理,但不能适应异步的情况
    /*
    if(successFlag){
      clearPassword();
    }
    */
}
怪我咯怪我咯2719 天前274

全部回覆(3)我來回復

  • 大家讲道理

    大家讲道理2017-04-11 11:38:34

    var ajax1 = $.ajax(url);
    var ajax2 = $.ajax(url);
    var ajax3 = $.ajax(url);
    $.when(
        ajax1, ajax2, ajax3
    ).then(function(data){
        console.log(data);
        clearPassword();
    });

    回覆
    0
  • PHPz

    PHPz2017-04-11 11:38:34

    其中的一种方式,若有不对,恳请告知,谢谢.

    var urls = []; // 不同系统的请求url
    
    urls.map(function(url){
        $.ajax({
            url: url,
            success: function(data) {
                successFn.call(this, data);
            }
        });
    });
    
    // 你的回调.
    function successFn(data) {
        if(data.success) {
            clearPassword();
        }
    }

    回覆
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-11 11:38:34

    这样已经可以了,或者可以试试promise.race

    回覆
    0
  • 取消回覆