首页 技术 正文
技术 2022年11月23日
0 收藏 544 点赞 2,933 浏览 1694 个字

前言

  当今 ES7 标准大行其道,使用 async + await 将异步逻辑同步书写已经普及,但是却有许多旧库或旧代码尚未完全 Promise 化,急需一个小工具去挖去这代码中藓疾。

设计和实现


  由于通常情况下,回调函数 callback 都是作为最后一个参数传入主调函数,所以 aw 小工具的设计如下:

// Transform Callback-style function to Promise-style function.
export type AwCallback<RES> = (res?: RES) => void;
export function aw(num: number): Promise<void>;
export function aw<A, B, C, D, E, /**/ RES>(exec: (a: A, b: B, c: C, d: D, e: E, callback: AwCallback<RES>) => void, a: A, b: B, c: C, d: D, e: E): Promise<RES>;
export function aw<A, B, C, D, /*---*/ RES>(exec: (a: A, b: B, c: C, d: D, /*-*/ callback: AwCallback<RES>) => void, a: A, b: B, c: C, d: D /*-*/): Promise<RES>;
export function aw<A, B, C, /*------*/ RES>(exec: (a: A, b: B, c: C, /*-------*/ callback: AwCallback<RES>) => void, a: A, b: B, c: C /*-------*/): Promise<RES>;
export function aw<A, B, /*---------*/ RES>(exec: (a: A, b: B, /*-------------*/ callback: AwCallback<RES>) => void, a: A, b: B /*-------------*/): Promise<RES>;
export function aw<A, /*------------*/ RES>(exec: (a: A, /*-------------------*/ callback: AwCallback<RES>) => void, a: A /*-------------------*/): Promise<RES>;
export function aw</*---------------*/ RES>(exec: (/*-------------------------*/ callback: AwCallback<RES>) => void /*-------------------------*/): Promise<RES>;
export async function aw(execOrNum: number | ((...res: any[]) => void), ...args: any[]) {
const exec = typeof execOrNum !== "number" ? execOrNum : (r: any) => setTimeout(r, execOrNum);
const res = await new Promise(r => exec.apply(null, [...args, r]));
if (res instanceof Error) throw res;
/*---------------*/ else return res;
}

使用

const func = (arg,callback)=>callback(arg);
const sum = (arg0:number,arg1:number,arg2:number,callback:(res:number)=>void )=>setTimeout(()=>callback(arg0+arg1+arg2),1000);
// 用法1:睡眠 1 秒
await aw(1000)
// 用法2:await aw(主调函数,依次顺序列出所有参数不包括回调函数)
const result1 = await aw(func,arg);
const result0 = await aw(sum, arg0,arg1,arg2) ;
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,257
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,695
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,535
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,306
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,944
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:5,104