zoukankan      html  css  js  c++  java
  • ES6---Promise 2: 微任务队列和任务执行顺序

    6. Promise 2: 微任务队列和任务执行顺序

    1. Promise有个微任务队列,轮询到执行的时候,就会从队列中调出任务,放在主线程执行。
    2. 队列中微任务可以多个
    3. 宏任务,最后执行(setTimeout)
     
    格式:
    new Promise(主任务).then(成功, 失败).then(成功,失败).then(...)
            new Promise((resolved, reject) => {
                //同步线程的代码
                console.log('我在主线程中说1');
                resolved('发出成功信号');
                // reject();
            }).then(
                //成功后的代码
                (result) => {
                    console.log('ok');
                },
                //失败后的代码
                (error) => {
                    console.log('not ok');
                }
            );
            console.log('我在主线程中说2');

    console: 观察结果打印顺序: 主线程1=>主线程2=>微任务队列按顺序执行,见下图

     见图

     

     先大哥,再二哥,再小弟

            new Promise((resolved, reject) => {
                //同步线程的代码
                console.log('我在主线程中说1');
                // resolved('发出成功信号');
                reject('发出失败信号');
            }).then(
                //成功后的代码
                (result) => {
                    console.log('ok');
                },
                //失败后的代码
                (error) => {
                    console.log('not ok');
                }
            );
            console.log('我在主线程中说2');

    再加个then, 看下顺序

    new Promise((resolved, reject) => {
                //同步线程的代码
                console.log('我在主线程中说1'); //大哥
                // resolved('发出成功信号');
                reject('发出失败信号');
            }).then(
                //成功后的代码
                (result) => {
                    console.log('ok1');
                    // resolved(); //写和不写一样,默认自己带了resolved
                },
                //失败后的代码
                (error) => {
                    console.log('not ok1');//小弟
                    // resolved(); //写和不写一样,默认自己带了resolved
                }
            ).then(
                //成功后的代码
                (result) => {
                    console.log('ok2');
                },
                //失败后的代码
                (error) => {
                    console.log('not ok2');//小弟
                }
            );
            console.log('我在主线程中说2'); //二哥

    console: 先进行大哥二哥两个主线程任务,再根据主线程里面的发出的reject, 微任务里面第一个then是执行not ok, 成功后,第二个then发出ok2

     主线程>微任务队列>宏任务,看图

            setTimeout(() => {
                console.log('我是宏任务');
            }, 0);
            new Promise((resolved, reject) => {
                //同步线程的代码
                console.log('我在主线程中说1');
                // resolved('发出成功信号');
                reject('发出失败信号');
            }).then(
                //成功后的代码
                (result) => {
                    console.log('ok1');
                },
                //失败后的代码
                (error) => {
                    console.log('not ok1');
                }
            )
            console.log('我在主线程中说2');

    console:

           

    复习: 

    1. let const

    a. 块作用域
    b. 不存在变量的提升,且存在死区
    c. 不可重复声明
    d. const不变的指针,指针里面的内容可变
     

    2. es5和es6关于私有变量

    1. es6基本不需要单独处理
    2. es5下
    a. IIFE(立即执行函数)
     (function () { })(); //表达式 (函数本身)(参数)
     
    b. 闭包 
     
    before引入闭包
    var kk=function(){
                var i=0;//私有变量
                i++;
                return i;
            } //里面的变量会污染到外部,因此把代码段写成一个函数

    after引入闭包

            var kk = function () {
                var i = 0;//私有变量
                return function () {
                    i++;
                    return i;
                }
            } //调用kk这个方法,会返回一个函数对象

    c. class

            class Test {
                constructor() {
                    this.name = name;
                }
                hi() { }
            }
    
            var ttt1 = new Test('小明');
            ttt1.hi();

    3. 箭头函数

    口诀:左参右码
    es6 (参数) => {代码段}
    es5 function(参数){}
     
    1. 当参数只有一个的时候,左边的括号可以去掉, 没有参数或多个参数不可以去掉
            kk => {
                console.log(KK);
            }
    2. 当右边的代码段有且只有1行return的代码时,右边的花括号以及return都可以去掉
     kk => kk + 1;
    3. 在{}对象中,function中的this是指向对象自己,但箭头函数没有这个this
     
            解决方法:
            a. 放弃使用箭头函数
            b. 在箭头函数外层,套一个setTimeout
            var o = {
                name: '花木兰',
                pp: function () {
                    setTimeout(() => {
                        console.log(this.name); //花木兰  setTimeout的外层是o
                    }, 0);
                }
            }
            o.pp();
            c. 使用class
            var name = '悟空';
            class Test {
                constructor() {
                    this.name = '哪吒';
                }
                pp() {
                    console.log(this.name);
                }
            }
            var o = new Test();
            o.pp();

    4. Symbol

    1. Symbol 让每一个对象的属性值独一无二
     
    2. es6七种类型: undefined, null, Boolean, String, Number, Object, Symbol
    打印类型: typeof a
    3. 声明Symbol变量有2种定义方式
    4. 描述: a.description
     
    let a = Symbol('这是描述'); //永远是不一样的
    let b = Symbol.for('这是描述'); 有一个容器,会先判断有没有这个对象,没有就创建
            let a = Symbol('this is a desc');
            var kkkk = typeof a;
            console.log(kkkk); //symbol
            console.log(a.description); // this is a desc
    5. 应用例子1: 定义不会重复id的对象
    let phone = { name: 'apple', price: 1200, key: Symbol() }

    6. 应用例子2: 全局缓存

    class Cache {
                static data = {};
                static set(key, value) {
                    this.data[key] = value;
                }
                static get(key) {
                    return this.data[key];
                }
            }
            Cache.set(phone.key, phone);

    5. Promise 1:状态与格式

    1. javascript是单线程多任务(任务是存放在队列)
    2. Promise3种状态
    •         pending 准备
    •         resolved 成功
    •         rejected 失败
     
    格式:
    new Promise(同步线程的代码).then(队列中的成功代码段, 队列中的失败代码段)
            new Promise((resolved, reject) => {
                //同步线程的代码
            }).then(
                //成功后的代码
                (result) => { },
                //失败后的代码
                (error) => { }
            );

    查看promise的状态

            var kk = new Promise((resolved, reject) => {
                //同步线程的代码
                resolved('成功');
                // reject();
            }).then(
                //成功后的代码
                (result) => {
                    console.log('ok');
                },
                //失败后的代码
                (error) => {
                    console.log('not ok');
                }
            );
            console.log(kk);
  • 相关阅读:
    OpenCV——Skewing
    OpenCV——PS滤镜算法之Spherize 球面化(凸出效果)
    机器学习 scikit-learn 图谱
    机器视觉 Histogram of oriented gradients
    Python: scikit-image canny 边缘检测
    机器视觉 Local Binary Pattern (LBP)
    Ice php配置
    Windows7下的免费虚拟机(微软官方虚拟机)
    经常使用的webservice接口
    怎样衡量一个公司是否靠谱
  • 原文地址:https://www.cnblogs.com/jane-panyiyun/p/12557713.html
Copyright © 2011-2022 走看看