Skip to content

协程和线程

  1. 协程是轻量级的线程
  2. 协程可以自行觉得是否继续执行代码
  3. 线程需要系统去分配 CPU 空间

生成器

基本用法

  1. 生成器是一个特殊的方法。

  2. 生成器中可使用 yield 关键字进行打断,让出 CPU 空间。

  3. 生成器的返回值是一个迭代器,外部可通过迭代器的 next() 方法控制生成器。

    js
    function * main() {
        console.log(123);
        yield;		// 打断
        console.log(789);
    }
    
    let it = main();    // 方法返回值是一个迭代器
    it.next();
    console.log(465);
    it.next();
    
    // 打印结果 123 456 798

与外界交互

  1. yield 后面可以携带参数,类似于 return。

  2. 外部通过 next() 的返回值接收 yield 返回内容。

    js
    function * 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 处理异步

  1. async 和 await 必须成对出现。
  2. 若方法中使用了 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();

基于 MIT 许可发布