• chapter1.7、Promise


    Promise

    Promise对象用于一个异步操作的最终完成(包括成功和失败)及结果值的表示。

    简单说,就是处理异步请求的。

    之所以叫做Promise,就是我承诺,如果成功则怎么处理,失败则怎么处理。

    new Promise(
        /* 下面定义的函数是executor */
        function(resolve, reject) {...}
    );

    executor

    executor 是一个带有 resolve 和 reject 两个参数的函数 。

    executor 函数在Promise构造函数执行时同步执行,被传递resolve和reject函数(executor 函数在Promise构造函数返回新建对象前被调用)。

    executor 内部通常会执行一些异步操作,一旦完成,可以调用resolve函数来将promise状态改成fulfilled即完成,或者在发生错误时将它的状态改为rejected即失败。

    如果在executor函数中抛出一个错误,那么该promise 状态为rejected。executor函数的返回值被忽略

    executor中,resolve或reject只能执行其中一个函数

    Promise的状态

    pending: 初始状态,不是成功或失败状态。

    fulfilled: 意味着操作成功完成。

    rejected: 意味着操作失败

    Promise.then(onFulfilled, onRejected)

    参数是2个函数,根据Promise的状态来调用不同的函数,fulfilled走onFulfilled函数,rejected走onRejected函数。
    then的返回值是一个新的promise对象。调用任何一个参数后,其返回值会被新的promise对象来resolve,向后传递。

    var myPromise = new Promise((resolve,reject) => {
        //resolve("ok"); //执行,置状态为fulfilled
        console.log("++++++++++++");
        reject("bad") // 永远执行不到,resolve和reject只能执行其一
        console.log("===============")
    });
    console.log("myPromise")
    
    myPromise.then(
        (value) => console.log(1,myPromise,value), // 成功,显示结果
        (reason) => console.log(2,myPromise,reason) // 失败,显示原因
    )

    catch(onRejected)

    为当前Promise对象添加一个拒绝回调,返回一个新的Promise对象。onRejected函数调用其返回值会被新的Promise对象用来resolve。 

    var myPromise = new Promise(function(resolve, reject) {
        setTimeout(() => {
            // resolve("ok"); //执行其一
            reject("not ok") //执行其一
        },1000)
    })
    
    console.log(myPromise) // 状态pending
    myPromise.then( // 根据Promise的状态,选择走那个函数
        (value) => {
            console.log(1,myPromise,value)
            return value // 如果不return,返回的新promise对象,只是简单地接受了本次promise对象的终态
        },
        (reason) => {
            console.log(2,myPromise,reason)
            return reason
            }
    ).then(
        function(x) { 
            console.log(x); //x上一个Promise对象返回的值
            return Promise.reject(x +"+++++++")
        }
    ).catch(x => { // 接收到的是上一个reject的值,在这里被Promise的resolve使用
        console.log(x);
        return Promise.resolve(x)
    })

    setTimeout函数是一个异步函数,设置的值为要执行的函数和等待时常,2000就是2秒

    异步实例

    var myPromise = new Promise((resolve,reject) => {
        //resolve("ok"); //执行,置状态为fulfilled
        console.log("++++++++++++");
        reject("bad") // 执行
        console.log("===============")
    });
    console.log("myPromise")
    
    abc = (myPromise.then(
        (value) => {
            console.log(1,myPromise,value) // 成功,显示结果
            return value
        },
        (reason) => {
            console.log(2,myPromise,reason) // 失败,显示原因
            return reason
        }
    ).then(
        function (v) {
            console.log(2.5,v)
            return Promise.reject(v + "**")
        }
    ).catch(reason => {
        console.log(3,reason);
        return Promise.resolve(reason)
    }))
    setTimeout(() => console.log(100,abc),2000) // 返回的对象仍是promise对象, Promise<"bad**">

    参考

    Promise

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

    then

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/then

    catch:

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/catch

  • 相关阅读:
    LINUX 内核守护进程
    LINUX 内核 API
    LINUX IO 图解
    doxygen
    xtrace
    Dapper-translation 分布式监控系统
    矩表
    最流行的5个前端框架对比
    2017年前端框架、类库、工具大比拼
    Top 10 JavaScript编辑器,你在用哪个?
  • 原文地址:https://www.cnblogs.com/rprp789/p/9975869.html
Copyright © 2020-2023  润新知