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);
})