js笔记十二:利用await和async,将回调函数变成同步的处理的办法

nodejs最大的亮点,就是异步处理了。但是异步让你的逻辑碎片化了...

为了解决这个问题,在ES5或更早的版本,就有async和promise等第三方开源,提供了同步处理的功能。大大缓解了逻辑碎片化的问题,但是总的来说,还是需要再加强。

ES6到来后,增加了await和async,在node 8.x提供了默认支持(默认使用了promise)。对于node 6.x或更早的版本,则需要通Babel做一次编译,将ES6编译成ES5,从而达到在node 6.x支持ES6的能力。

但是原来的很多方法,都是用回调来实现算是的,在不用修改原代码的基础,我这里实现了waitFunction,将回调的方式变成同步的处理,使得逻辑处理变成同步的情况(实际上还是异步的,只是代码逻辑看起来是顺序的)

下面是具体实现:

    /**
     * 异步调用函数,注意:要求第一个参数回调函数
     * @static
     * @param {function} paramFunc 要调用的函数
     * @param {...args} args 要调用的参数
     * @return {...args} 返回回调函数的传入参数列表
     */
    async WaitFunction(paramFunc, ...args) {
		return new Promise((resolve) => {
			paramFunc((...result) => {
				resolve(result);
			}, ...args);
		});
	}
	
	/**
     * 异步调用函数,注意:
	 * - 要求第一个参数回调函数,要给函数的参数
	 * - 要求以依次存放到数组paramList传入。
	 * 
	 * 这个函数和WaitFuncion主要的区别是:传入函数的回调,是放到最后面的,而WaitFuncion则要求是第一个参数
	 * 
	 * @static
	 * @param {function} paramFunc 要调用的函数
	 * @param {...args} args 要传给函数的参数数组
	 */
	async WaitFunctionEx(paramFunc, ...args) {
		return new Promise((resolve) => {
			paramFunc(...args, (...result) => {
				resolve(result);
			});
		});
	}

    /**
     *  异步调用类成员函数,注意:要求第一个参数回调函数
     * @static
     * @param {object} paramObject 要调用函数的对象实例
     * @param {String} paramFunc 要调用的函数名称
     * @param {...args} args 要调用的参数
     * @return {...args} 返回回调函数的传入参数列表
     */
    async WaitClassFunction(paramObject, paramFunction, ...args) {
		return new Promise((resolve) => {
			paramObject[paramFunction]((...result) => {
				resolve(result);
			}, ...args);
		});        
	}
	
    /**
     *  异步调用类成员函数,注意:要求第一个参数回调函数
     * @static
     * @param {object} paramObject 要调用函数的对象实例
     * @param {String} paramFunc 要调用的函数名称
     * @param {...args} args 要调用的参数
     * @return {...args} 返回回调函数的传入参数列表
     */
    async WaitClassFunctionEx(paramObject, paramFunction, ...args) {
		return new Promise((resolve) => {
			paramObject[paramFunction](...args, (...result) => {
				resolve(result);
			});
		});        
	}
其中,WaitFunction或WaitFunctionEx是直接处理函数的回调,不是类成员的函数,WaitClassFunction或WaitClassFunctionEx则是处理类的成员函数回调。  
所以不带Ex的,要求回调函数是放在第一个参数的位置,如function test(cb, param1,param2)这种,所以带Ex则是要求回调函数做为参数的最后一个位置,如:function test(param1,param2,cb);

返回值result则是cb的参数列表,在这里变成了列表数组,处理完后调用回调的时候传入。

下面一个例子:

    /**
     * 休眠指定的毫秒数
     * @param {Integer} paramT 要休眠的时长
     * @return {void} 无返回值 
     */
    static async sleep(paramT) {
        await this.WaitFunction(setTimeout, paramT);
    }    

这个sleep实际中,是利用setTimeout的功能,达到sleep的功能。

最后:注意,WaitFunction等函数,要求在async 定义的函数中使用,并且要加上await,才能正确使用。下面给出一个完整例子:

/** 回调在最后 */
function calc(param1,param2,cb) {
	let n = param1 + param2;
	cb(n);
}
/** 回调在最前 */
function test1(cb, param1,param2) {
	cb(param2, param1)
}
//doTest这个函数,要加async
async doTest() {
	let s = await WaitFunctionEx(calc, 1,2);
	console.log(s);  //这里会打印3
	let [p1,p2] = await WaitFunction(test1, 99,100);
	console.log(p1,p2); //这里会打印100,99
}

doTest();


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值