
您可以在 github 仓库中找到这篇文章中的所有代码。
异步编程回调相关的挑战
在特定秒后调用回调
/**
* @param {function} callbackfn
* @param {delay} number
* @return {object}
*/
function invokelater(callbackfn, delay) {
const timerid = settimeout(() => {
callbackfn(null, 'run');
}, delay);
return {
clear: () => cleartimeout(timerid),
}
}
// usage example
const cancel = invokelater((err, data) => {
console.log(data);
cancel.clear();
}, 2000);
压扁重击
/**
* @param {function} fn
* @return {function}
*/
function flattenThunk(fn) {
return function (callbackFn) {
function resolveThunk(err, result) {
if (err) {
callbackFn(err, undefined);
return;
}
if (typeof result === 'function') {
result(resolveThunk);
} else {
callbackFn(undefined, result);
}
}
fn(resolveThunk);
}
}
// Usage example
function fn1(callbackFn) {
setTimeout(() => {
callbackFn(null, 'ok');
}, 10);
}
function fn2(callbackFn) {
setTimeout(() => {
callbackFn(null, fn1);
}, 10);
}
function fn3(callbackFn) {
setTimeout(() => {
callbackFn(null, fn2);
}, 10);
}
flattenThunk(fn3)((err, data) => {
console.log(data); // 'ok'
});
参考
- 回调(计算机编程)- wikipedia.org
- 回调函数 - mdn
- thunk - wikipedia.org
- 54。压平 thunk - bfe.dev










