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();
为了解决这个问题,在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();
相关文章推荐
- 利用async和await异步操作解决node.js里面fs模块异步读写,同步结果的问题
- js 利用iframe和location.hash跨域解决办法,java图片上传回调JS函数跨域
- node 开发中常用的async/await 处理回调的几种形式
- node.js在windows下的学习笔记(4)---同步,异步,回调的概念
- async/await - 4.处理async函数中的错误
- [笔记]如何将传统的回调函数转换为C#5.0支持的await格式
- <a> 里面herf执行JS函数的处理办法,网上找的一个比较靠谱的
- silverlight学习之路(2)异步编程趋于同步 利用async和await调用wcf服务
- js 利用iframe和location.hash跨域解决的方法,java图片上传回调JS函数跨域
- [原创.数据可视化系列之十二]使用 nodejs通过async await建立同步数据抓取
- boost库学习随记六:使用同步定时器、异步定时器、bind、成员函数回调处理、多线程的同步处理示例等
- [笔记]如何将传统的回调函数转换为C#5.0支持的await格式
- jQuery.form.js插件回调函数失效的解决办法
- JS学习笔记1——不要使用JavaScript内置的parseInt()和Number()函数,利用map和reduce操作实现一个string2int()函数
- angular2 学习笔记 ( Rxjs, Promise, Async/Await 的区别 )
- 函数项目【COCOS2DX-LUA 脚本开发之十二】Hybrid模式-利用AssetsManager实现在线更新脚本文件lua、js、图片等资源(免去平台审核周期)函数项目
- Node.js学习笔记(3)——关于回调函数和函数的回调
- 一种通过async/await实现函数同步执行的方式
- boost库学习随记六:使用同步定时器、异步定时器、bind、成员函数回调处理、多线程的同步处理示例等
- 【小白笔记】PHP学习之路 (17) --通过回调函数得到数组交集或差集