zoukankan      html  css  js  c++  java
  • Promise详解

    本文主要通过对Promise的八大特性讲解,来详细探讨Promise。

    1.立刻执行性

    const p = new Promise((resolve, reject) => {
        console.log("create a promise");
        resolve("success");
    });
    
    console.log("after new Promise");
    p.then((value) => {
        console.log(value);
    });

    执行结果:

    分析:只要一创建Promise,就会立即执行Promise的内部函数

    2.三大状态(Promise有且只有三种状态pending,resolved,rejected)

    var p1 = new Promise((resolve, reject) => {
        resolve(1);
    });
    var p2 = new Promise((resolve, reject) => {
        setTimeout(function () {
            resolve(2);
        }, 500);
    });
    var p3 = new Promise((resolve, reject) => {
        setTimeout(function () {
            reject(3);
        }, 500);
    });
    console.log('0', p1);
    console.log("1", p2);
    console.log("2", p3);
    setTimeout(() => {
        console.log("3", p2);
    }, 1000);
    setTimeout(function () {
        console.log("4", p3);
    }, 1000);
    p1.then((value) => {
        console.log("5", value);
    });
    p2.then((value) => {
        console.log("6", value);
    });
    p3.catch((err) => {
        console.log("7", err);
    });

    结果:

    3.状态不可逆(Promise状态只能由pending到resolved或者由pending到rejected)

    const p1 = new Promise(function (resolve, reject) {
        resolve("success1");
        resolve("success2");
    });
    
    const p2 = new Promise(function (resolve, reject) {
        resolve("success");
        reject("reject");
    });
    
    p1.then(function (value) {
        console.log(value);
    });
    
    p2.then(function (value) {
        console.log(value);
    });

    结果:

    4.then回调异步性

    const p = new Promise(function (resolve, reject) {
        resolve("success");
    });
    
    p.then(function (value) {
        console.log(value);
    });
    
    console.log("which one is called first ?");

    输出结果:

    5.支持链式调用

    const p = new Promise((resolve, reject) => {
        resolve(1);
    });
    p.then((value) => {
        console.log(value);
        return value * 2;
    })
    .then((value) => {
        console.log(value);
    })
    .then((value) => {
        console.log(value);
        return Promise.resolve('resolve');
    })
    .then((value) => {
        console.log(value);
        return Promise.reject('reject');
    })
    .then((value) => {
        console.log('resolve: ' + value);
    }, (err) => {
        console.log('reject: ' + err);
    })

    输出结果:

    6.异常处理:

    const p1 = new Promise( function(resolve,reject){
        foo.bar();
        resolve( 1 );      
    });
    p1.then((value)=>{
            console.log('p1 then value: ' + value);
        },
        (err)=>{
            console.log('p1 then err: ' + err);
        }
    )
    .then((value)=>{
            console.log('p1 then then value: '+value);
        },
        (err)=>{
            console.log('p1 then then err: ' + err);
        }
    );
    const p2 = new Promise((resolve,reject)=>{
        resolve( 2 );    
    });
    p2.then(
        (value)=>{
            console.log('p2 then value: ' + value);
            foo.bar();
        }, 
        (err)=>{
            console.log('p2 then err: ' + err);
        }
    )
    .then(
        (value)=>{
            console.log('p2 then then value: ' + value);
        },
        (err)=>{
            console.log('p2 then then err: ' + err);
            return 1;
        }
    ).then(
        (value)=>{
            console.log('p2 then then then value: ' + value);
        },
        (err)=>{
            console.log('p2 then then then err: ' + err);
        }
    );

    输出:

    7.Promise.resolve

    let p1 = Promise.resolve(1);
    let p2 = Promise.resolve(p1);
    let p3 = new Promise(function (resolve, reject) {
        resolve(1);
    });
    let p4 = new Promise(function (resolve, reject) {
        resolve(p1);
    });
    console.log(p1 === p2);
    console.log(p1 === p3);
    console.log(p1 === p4);
    console.log(p3 === p4);
    p4.then(function (value) {
        console.log('p4=' + value);
    });
    p2.then(function (value) {
        console.log('p2=' + value);
    })
    p1.then(function (value) {
        console.log('p1=' + value);
    })

    输出结果:

    8.resolve和reject

    const p1 = new Promise((resolve, reject)=>{
        resolve(Promise.resolve('resolve'));
    });
    const p2 = new Promise((resolve, reject)=>{
        resolve(Promise.reject('reject'));
    });
    
    const p3 = new Promise((resolve, reject)=>{
        reject(Promise.resolve('resolve'));
    });
    
    p1.then((value)=>{
            console.log('fulfilled: ' + value);
        }, 
        (err)=>{
            console.log('rejected: ' + err);
        });
    p2.then((value)=>{
            console.log('fulfilled: ' + value);
        }, 
        (err)=>{
            console.log('rejected: ' + err);
        });
    p3.then((value)=>{
            console.log('fulfilled: ' + value);
        },
        (err)=>{
            console.log('rejected: ' + err);
        });

    输出结果:

  • 相关阅读:
    谈屡面屡胜的面试经验
    同步异步和阻塞非阻塞的区别
    Ansible条件测试
    Ansible playbook基础组件介绍
    Ansible的基础元素和YAML介绍
    Ansible常见模块介绍
    Ansible介绍及安装部署
    Spark介绍及安装部署
    安装部署Apache Hadoop (完全分布式模式并且实现NameNode HA和ResourceManager HA)
    安装部署Apache Hadoop (本地模式和伪分布式)
  • 原文地址:https://www.cnblogs.com/sghy/p/7519678.html
Copyright © 2011-2022 走看看