ECMA6Script的Generator函数及async,await解决回调嵌套问题

1.使用Generator函数解决回调嵌套

let logger = require('../config/common').logger;
let connect = require('../config/common').connect;

/*函数1  返回Promise对象*/
let getSlotCapPromise = function(){
    return new Promise((resolve, reject) => {
        let sql = "select item_value from tbl_ft_sys tfs where tfs.item_name='DISC_CAPACITY'";
        connect.query(sql,function (err,results) {
            if(err){
                logger.error(err);
                reject(err);
            }
            else{
                console.log(results[0].item_value)
                // return results[0].item_value;
                resolve(results[0].item_value);
            }
        });
    });
}

/*函数2  返回Promise对象*/
let getDiscLibCapPromise = function (slotCap) {
    return new Promise((resolve,reject)=>{
 
      let sql = 'SELECT disc_type as "discType",COUNT(*) as "discNum",  ROUND(SUM(rest_cap)/(1024*1024*1024),2) as "discRestCap" '+
        'FROM tbl_slots ts JOIN tbl_magzines tm ON ts.mag_id = tm.mag_id WHERE '+
        'tm.mag_order IS NOT NULL AND ts.disc_type != 0 AND LENGTH(ts.disc_type) > 0  GROUP BY ts.disc_type';
        connect.query(sql,function (err,results) {
            if(err){
                logger.error(err);
                reject(err);
            }
            else{
                let res = new Object();
                res.totalinfo=0;
                res.usedinfo=0;
                let totalDisc=0;
                for(let i=0;i<results.length;i++){
                   totalDisc+=results[i].discNum;
                    if(results[i].discType==2){//使用完封盘
                        res.usedinfo +=results[i].discNum*slotCap;
                    }
                    else if(results[i].discType==3){//有剩余
                        res.usedinfo+=slotCap-results[i].discRestCap;
                    }
                }
                res.totalinfo = slotCap*totalDisc;               
                resolve(res);
            }
        });
    });
}

/*定义产生式函数  将函数1的返回值作为参数传入函数2*/
function *getDiscLibCap(){
    let slotCap = yield getSlotCapPromise();
    let rr = yield getDiscLibCapPromise(slotCap);
}

/*定义  执行产生式函数步骤*/
function test() {
    let hw = getDiscLibCap();//获得产生式函数指针
    let res1 = hw.next();//执行第一个yield语句
     res1.value.then(function (data) {//data为resolve函数的返回值
         console.log("data="+data)
         return hw.next(data).value;//将第一个函数的返回值作为参数传入第二个函数
     }).then(function (data2) {//获取第二个函数的返回值
        console.log("data2="+JSON.stringify(data2));
    });
}
test();//执行函数

2.使用async 和 await 解决回掉嵌套

let p1 = function(x1){
    return new Promise(function (resolve,reject) {
       resolve(x1);
    });
}
let p2 = function(x2){
    return new Promise(function(resolve,reject){
        resolve(x2);
    })
}

let p3 = function(x1,x2){
    return new Promise(function(resolve,reject){
        resolve(x1+x2)
    })
}

/*定义异步函数*/
async function testAsync(){
   let v1 = await p1(1);
   console.log(v1)   //输出1
   let v2 = await p2(2);
   console.log(v2)  //输出2
    let v3 = await p3(v1,v2);
   console.log(v3) //输出3
}
let pp = testAsync()  //执行async函数

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值