nodejs异步变同步的几种方式

async库,es6的promise-then,es7的await-async

1. for循环中的异步转同步,常常用到nodejs的async库,有好多种方法支持异步变同步的,常用的有:

async.each(): 经常使用,类似于forEach结合累加器flag++,每轮循环是按照顺序开启的,但执行是异步的,比如index=1和index=100, 开启任务一定是前者在先,但执行结束也可能是index=100的先输出结果。

async.eachSeries(): 严格保证了循环内部每次都是同步的,类似于java里单线程的for循环查询数据库了。

递归:传统的递归方法也能严格保证同步,包括前台js比如angularjs controlle中for循环http请求。

 

2.有限的多个业务的异步变同步,可以用回调一直嵌套,代码维护太复杂,用以下方法优化:

async.waterfull(): 同步执行(串行)有关联,function之间有数据交互,上一个function的输出,可作为下一个function的输入。

async.series(): 同步执行(串行)无关联,function之间无交互。

 

3. promise-then和await-async

两个等同的方法,await-async使用起来更加简单优雅,async方法同步return相当于新建了一个Promise 返回出去了,await相当于.then()

async = return new Promise, await = then 

// return promise, 必须用.then或者await接收
function promiseDemo () {
	return new Promise((resolve) => {
	resolve(2);
})
}

// then方式
function testPromiseDemo1 () {
	promiseDemo().then((data) => {
		console.log(data);
	})
}
testPromiseDemo1();

// await方式
async function testPromiseDemo2 () {
	var val = await promiseDemo();
	console.log(val);
	return val;
}
testPromiseDemo2();  // 内部打印2
testPromiseDemo2().then((data) => {
	console.log(data);  // 打印返回值2
})



// 相当于return new Promise((resolve) => {resolve(1)})
async  function asyncDemo() {
	return 1;
}

// then方式接收,或者也可以用await接收
asyncDemo().then((data) => {
	console.log(data);  
})

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值