串行处理不定数量的异步请求,并且这些异步请求有前后依赖关系,我的方案如下:
第一步:将一个拥有回调函数的异步请求函数封装为一个只需要传回调函数的单参数函数(函数的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再次返回一个只需传回调函数的单参数请求函数,这里用到了递归的思想