Open msforest opened 6 years ago
function isAsync(fn) {
return fn[Symbol.toStringTag] === 'AsyncFunction'; //这里没看懂,什么情况下会为true??
// return Object.prototype.toString.call(fn) === '[object AsyncFunction]'
}
oh, i know.:sweat_smile: refer
function waterfall(tasks, done) {
var promise = tasks.reduce((prev, task) => prev.then((value) => task(value)), Promise.then());
promise.then((value) => done(value));
}
waterfall
定义很简单,只用一个函数就解决了,比看
parallel
轻松多了。once
和onlyOnce
没看出来有什么区别,都只是为了保证fn
不为空;即使在被返回的函数里切断了fn
的关系,并不能使得下一次调用相同的fn
等于null
;我认为切断关系是为了尾调用优化
的机制。once
是为了保证fn
在所在的词法作用域(waterfall
)中只被调用一次,类似地,onlyOnce
也是为了保证fn
在所在的词法作用域(nextTask
)中只被调用一次。once
用于async库内部保证callback被安全调用一次;onlyOnce
用于外部调用async库内部的callback被安全调用一次,如果调用多次,把错误抛给用户。error===false
可以起到提前退出流程控制的作用,但是会使得程序挂起,因为callback
无法执行