Open AlexStacker opened 6 years ago
我不能复现你的问题, done 都是存在的。我觉得也不应该,async 文档上是说那样用的,一般不可能不同的 node 版本出现两种不同的调用方式吧
确定没出现吗?我用的node8,tsconfig.json的target修改成es2017,vscode debug然后调用确实变了,修改前后两次不一样,执行的async库没有将done传过去,而是先执行,根据结果判断再调用done
// async.js L2498-L2509
function reduce(coll, memo, iteratee, callback) {
callback = once(callback || noop);
var _iteratee = wrapAsync(iteratee);
eachOfSeries(coll, function(x, i, callback) {
_iteratee(memo, x, function(err, v) {
memo = v;
callback(err);
});
}, function(err) {
callback(err, memo);
});
}
// async.js L225-233
var supportsSymbol = typeof Symbol === 'function';
function isAsync(fn) {
return supportsSymbol && fn[Symbol.toStringTag] === 'AsyncFunction';
}
function wrapAsync(asyncFn) {
return isAsync(asyncFn) ? asyncify(asyncFn) : asyncFn;
}
又debug了一下流程,生成出来的js reduce后会走wrapAsync封装一次,然后走了asyncify才会出现的done
找不到。用的是node8.9.3、typscript2.8.1应该和这个没关系吧。
本来想调试简单一些,直接使用node的async、await,就将target调整为es2017,不用typescript的tslib,结果报done不存在了。 如果调整target为es2017的话async库的调用方式不一样,会走asyncify不传递callback
我将代码调整了一下,大佬要不要参考一下