1、异步编程
- 回调函数
setTimeout(function asyncCallback() {
conosle.log('inner of callback')
}, 1000)
如果下一个异步操作依赖于上一个异步操作的结果,回调函数这种方式就会出现多层嵌套的结构。这种问题被称为回调深渊:
ajax.get(url1, function cb(resultFromUrl1) {
ajax.get(resultFromUrl1.url, function cb(resultFromUrl2) {
ajax.get(resultFromUrl2.url, function cb(resultFromUrl3) {
ajax...
})
})
})
社区中很早就出现了promise
的这种解决方案,es6
也将其规范化了。
promise
用promise
将上面的流程重写:
// 将ajax.get封装成promise
const promiseAjaxGet = (url) => new Promise((resolve, reject) => {
ajax.get(url, resolve)
})
// 使用
promiseAjaxGet(url1).then((resultFromUrl1) => {
return promiseAjaxGet(resultFromUrl1.url)
}).then((resultFromUrl2) => {
return promiseAjaxGet(resultFromUrl2.url)
}).then((resultFromUrl3) => {
return promiseAjaxGet(resultFromUrl3.url)
}).then(/*...*/)
虽然这种链式调用的方式比之前的回调函数的嵌套方式从可读性上更好些,但是一坨坨的.then
调用,在语义上还是不够友好。
2、generator
2.1 generator的概念
function* name([param[, param[, ... param]]