您的位置:首页 > Web前端 > JavaScript

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

2018-03-07 13:38 741 查看
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();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐