定义:函数A作为参数 (函数引用)传递到另一个函数B中,并且这个函数B执行函数A。
ajax(url, () => { // 处理逻辑 })
缺点
Generator
Promise
async 及 await
常用定时器函数
Generator 最大的特点就是可以控制函数的执行。
function *foo(x) { let y = 2 * (yield (x + 1)) let z = yield (y / 3) return (x + y + z) } let it = foo(5) console.log(it.next()) // => {value: 6, done: false} console.log(it.next(12)) // => {value: 8, done:false} console.log(it.next(13)) // => {value: 42, done:true}
三种状态:等待中(pending);完成了 (resolved);拒绝了(rejected)。状态一旦改变成其他状态就不能再次改变。
在构造 Promise 的时候,构造函数内部的代码是立即执行的。
new Promise((resolve, reject) => { console.log('new Promise') resolve('success') }) console.log('finifsh') // new Promise -> finifsh
Promise 实现了链式调用,也就是说每次调用 then 之后返回的都是一个 Promise ,并且是一个全新的 Promise ,原因也是因为状态不可变。如果你在 then 中 使用了 return ,那么 return 的值会被 Promise.resolve() 包装。
Promise.resolve(1) .then(res => { console.log(res) // => 1 return 2 // 包装成 Promise.resolve(2) }) .then(res => { console.log(res) // => 2 })
缺点:无法取消 Promise ,错误需要通过回调函数捕获。
一个函数如果加上 async ,那么该函数就会返回一个 Promise。
async function test() { return "1" } console.log(test()) // -> Promise {<resolved>: "1"}
async 就是将函数返回值使用 Promise.resolve() 包裹了下,和 then中处理返回值一样,并且 await 只能配套async 使用。
async function test() { let value = await sleep() }
优点在于处理 then 的调用链,能够更清晰准确的写出代码,毕竟写一大堆 then 也很恶心,并且也能优雅地解决回调地狱问题。
缺点在于 await 将异步代码改造成了同步代码,如果多个异步代码没有依赖性却使用了 await 会导致性能上的降低。
let a = 0 let b = async () => { a = a + await 10 console.log('2', a) // -> '2' 10 } b() a++ console.log('1', a) // -> '1' 1
解释:
await 就是 generator 加上 Promise 的语法糖,且内部实现了自动执行 generator。