js发展到现在,异步编程可以划分四个阶段,也就是有四种异步编程的方式。
1. 回调函数 callback
foo(val, () => {
foo(val1, () => {
foo(val2, () => {
foo(val3, () => {
//do something
})
})
})
})
会导致回调地狱,不能使用try/catch捕捉错误
2. promise
function bar() {
return new Promise((res, rej) => {
foo(val, (data, err) => {
if (data) res(data);
rej(err)
})
})
}
bar(val).then(data => {
return bar(val1);
}).then(data => {
return bar(val2)
}).then(data => {
return bar(val3)
}).catch(err => {
console.log(err);
})
改写上面的回调函数
3. generator/yield
let co = require('co')
function* bar() {
yield foo(val);
yield foo(val1);
yield foo(val2);
yield foo(val3);
}
co(bar()).then(data => {
//...
}).catch(err => {
console.log(err);
})
需要自己写迭代器函数,可以借助于co库来实现
4. async/await
async function bar(val) {
try {
let p1 = await foo(val);
let p2 = await foo(p1);
let p3 = await foo(p2);
let p4 = await foo(p3);
return p4;
} catch (err) {
console.log(err);
}
}
generator函数和自执行器(co)封装而成
使用try/catch来捕获错误。
记录记录!