function sequentialize Promise>(
asyncFn: T
): (...args: Parameters) => ReturnType {
let queue: Promise = Promise.resolve(); // 初始化队列
return function (...args: Parameters): ReturnType {
const result = queue.then(() => asyncFn(...args)); // 将异步任务添加到队列中
queue = result.catch(() => {}); //捕获错误,防止队列中
return result as ReturnType; //确保返回类型与原始函数一致
};
}
async function plus(a: number, b: number): Promise {
await new Promise((resolve) => {
setTimeout(() => {
resolve();
console.log(performance.now(), a, b);
}, 1000);
});
return a + b;
}
const sequentializePlus = sequentialize(plus);
但这在 Swift 和 Kotlin 里不太好处理,它们没法传入动态的函数,并包装后返回同类型的函数。想问下,如果像 Swift 和 Kotlin 这样的强类型语言要实现这样的语法,是否会存在什么限制?是否是因为 TS 编译后的 JS 是动态类型的,才支持这种类型推导(运行不会出问题),而 Swift 和 Kotlin 无法做到?