js处理异步问题

场景一:循环list中的数据,每个数据都要用ajax查询数据库并赋值

第一种处理方式

function getDrugPrescAttr(ordersDrugWestListPresc, index, callback){
    var doctorOrders = ordersDrugWestListPresc[index];
    var successCallback = function (data) {
        doctorOrders.prescAttr = getDrugPrescAttrDetail(data.toxiCode);
        if (index < ordersDrugWestListPresc.length - 1) {
            getDrugPrescAttr(ordersDrugWestListPresc, ++index, callback);
        } else {
            callback();
        }
    };
    HrUtils.httpRequest($http, Path.getUri("api/inp-orders/get-drug-prescAttr?drugCode=" + doctorOrders.drugOrderDetail.drugCode), successCallback, null, hrDialog, HrUtils.httpMethod.POST, null);
}

使用方法 :

getDrugPrescAttr(ordersDrugWestListPresc, 0, function(){
    //查询后处理后续流程
})

第二种处理方式(1)

function getDrugPrescAttr(ordersDrugWestListPresc, callback){
    var asyncInfo = {total: 0, count: 0};
    if(ordersDrugWestListPresc !==null && ordersDrugWestListPresc.length > 0){
        for(var i=0; i<ordersDrugWestListPresc.length; i++){
            asyncInfo.total ++;
            var doctorOrders = ordersDrugWestListPresc[i];
            var successCallback = function (data) {
                asyncInfo.count ++;
                doctorOrders.prescAttr = getDrugPrescAttrDetail(data.toxiCode);
                if(asyncInfo.count === asyncInfo.total){
                    callback();
                }
            };
            HrUtils.httpRequest($http, Path.getUri("api/inp-orders/get-drug-prescAttr?drugCode=" + doctorOrders.drugOrderDetail.drugCode), successCallback, null, hrDialog, HrUtils.httpMethod.POST, null);
        }
    }
    if(asyncInfo.count === asyncInfo.total){
        callback();
    }
}

第二种处理方式(2)

function getDrugDictForPresc(doctorOrders, callback){
    var successCallback = function (data) {
        doctorOrders.prescAttr = getDrugPrescAttrDetail(data.toxiCode);
        callback();
    };
    HrUtils.httpRequest($http, Path.getUri("api/inp-orders/get-drug-prescAttr?drugCode=" + doctorOrders.drugOrderDetail.drugCode), successCallback, null, hrDialog, HrUtils.httpMethod.POST, null);
}

//获取药品属性
function getDrugPrescAttr(ordersDrugWestListPresc, callback){
    var asyncInfo = {total: 0, count: 0};
    if(ordersDrugWestListPresc !==null && ordersDrugWestListPresc.length > 0){
        for(var i=0; i<ordersDrugWestListPresc.length; i++){
            asyncInfo.total ++;
            var doctorOrders = ordersDrugWestListPresc[i];
            getDrugDictForPresc(doctorOrders, function(){//查询数据库(ajax)
                asyncInfo.count ++;
                if(asyncInfo.count == asyncInfo.total){
                    callback();
                }
            })
        }
    }
    if(asyncInfo.count === asyncInfo.total){
        callback();
    }
}

使用方法

getDrugPrescAttr(ordersDrugWestListPresc, function(){
    //处理后续问题
})
原文地址:https://www.cnblogs.com/ms-grf/p/8005308.html