不定量异步请求的串行处理

串行处理不定数量的异步请求,并且这些异步请求有前后依赖关系,我的方案如下:

第一步:将一个拥有回调函数的异步请求函数封装为一个只需要传回调函数的单参数函数(函数的curring,如果我没记错),代码如下:

//这是一个正常的异步函数
mysql.query('select...', callback)

//单参数版本
const thunk = function (queryStr) {
    return function (callback) {
        return mysql.query(queryStr, callback);
    }
};

const thunkQuery = thunk('select...');
thunkQuery(callback);

第二步:定义一个Generator函数

const queryArr = ['select...', 'select...', ...];
function* gen(queryArr, limit) {
    let i = 0,
        length = queryArr.length,
        results = [];
    do {
        const result = yield thunk(queryArr[i]);
        Array.prototype.push.apply(results, result);
        i += 1;
    } while (i < length && results.length < limit )//这里可以加其他让Generator停下来的条件
    return results;
}

第三步:定义一个控制Generator执行流程的管理器

function autoRun(fn){
    const gen = fn();
    
    function next(err, data) {
        var result = gen.next(data);
        if (result.done) return result;
        result.value(next);
    }
    next();
}

第三步的关键点是每一步的异步请求结束后,将结果返回给genrator,由genrator管理请求的结果数据,并且generator再次返回一个只需传回调函数的单参数请求函数,这里用到了递归的思想

转载于:https://www.cnblogs.com/bellhey/articles/7341899.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值