搜索文档
协程和线程
- 协程是轻量级的线程
- 协程可以自行觉得是否继续执行代码
- 线程需要系统去分配 CPU 空间
生成器
基本用法
生成器是一个特殊的方法。
生成器中可使用 yield 关键字进行打断,让出 CPU 空间。
生成器的返回值是一个迭代器,外部可通过迭代器的 next() 方法控制生成器。
jsfunction * main() { console.log(123); yield; // 打断 console.log(789); } let it = main(); // 方法返回值是一个迭代器 it.next(); console.log(465); it.next(); // 打印结果 123 456 798
与外界交互
yield 后面可以携带参数,类似于 return。
外部通过 next() 的返回值接收 yield 返回内容。
jsfunction * main() { console.log(123); yield 456; console.log(789); return 'abc' } let it = main(); let r0 = it.next(); console.log(r0); let r1 = it.next(); console.log(r1); /* 打印结果: 123 {value: 456, done: false} 789 {value: 'abc', done: true} */
回调函数处理异步
js
// 异步方法 1
const test1 = (callback) => {
setTimeout(() => {
callback('test1');
}, 1000);
}
// 异步方法 2
const test2 = (callback) => {
setTimeout(() => {
callback('test2');
}, 2000);
}
// 入口
const main = () => {
test1(e1 => {
console.log(e1);
test2(e2 => {
console.log(e2);
})
});
}
main();ES6 Promise 处理异步
js
// 异步方法 1
const test1 = () => new Promise((t, f) => {
setTimeout(() => {
t('test1')
}, 1000);
})
// 异步方法 2
const test2 = () => new Promise((t, f) => {
setTimeout(() => {
t('test2')
}, 2000);
})
// 入口
const main = () => {
test1().then(e1 => {
console.log(e1);
return test2();
}).then(e2 => {
console.log(e2);
})
}
main();- promise 对象有三种状态:
- pending(初始状态)
- resolved / fulfilled (成功)
- rejected(失败)
- Promise.all([promiseObject, promiseObject, promiseObject……])
ES7 async...await 处理异步
- async 和 await 必须成对出现。
- 若方法中使用了 await,那么必须使用 async 定义该方法。
js
// 异步方法 1
const test1 = () => new Promise((t, f) => {
setTimeout(() => {
t('test1')
}, 1000);
})
// 异步方法 2
const test2 = () => new Promise((t, f) => {
setTimeout(() => {
t('test2')
}, 2000);
})
// 入口
const main = async () => {
let res = await test1();
console.log(res);
res = await test2();
console.log(res);
}
main();