• # Promise的简单理解和基本使用


    英文 中文翻译
    Promise 承诺
    resolve 解决
    reject 故障

    Promise

    1. Promise是一个对象,它代表了一个异步操作的最终完成或者失败。

    2. 本质上Promise是一个函数返回的对象,我们可以在它上面绑定回调函数,这样我们就不需要在一开始把回调函数作为参数传入这个函数了。

      MDN:使用 Promise

    Promise,在英文中,即是“承诺”的意思, 这和我们日常生活中,是一样的,既然是承诺,就会有实现承诺,和无法实现承诺的情况。在程序中也是如此。

    例如,你向朋友承诺,明天5点就会起床,你就有可能做到,或者因为种种原因可能没做到的情况。 基于此,我们编写一下示例:

    let GetUpEarly = true;
    let a = new Promise((resolve, reject)=>{
    	if(GetUpEarly){
    		resolve()
    	}else{
    		reject()
    	}
    })
    
    a.then(()=>{
    	console.log("Yes I do make it ! bravoooooo...")
    }).catch(()=>{
    	console.log("Holy fuck! I dreamed I get up at 3am !!")
    })
    

    简单的说明,我们定义了一个名为GetUpEarly的变量,其默认值为true。然后,定义了一个变量a,它用于接收一个通过new关键字实例化出来的promise对象。
    这个promise对象中,有一个函数作为参数,该函数有两个基本的参数,分别是resolve,reject
    接着,对这个promise对象中提供的方法进行一些操作。

    此时,如果直接在终端中去运行,它将有如下输出:

    $ node index.js
    Yes I do make it ! bravoooooo...
    

    如果做出一点点修改,let GetUpEarly = true;,输出将发生一些我们预期内的改变:

    $ node index.js
    Holy fuck! I dreamed I get up at 3am !!
    

    其实,目前,为止,这就是我们需要知道的promise的基本使用。

    对其进行一些说明,首先,核心就是要明白resolve()then()reject()catch(),是存在对应关系的。

    另外,我们生活中的承诺“做某事”,在以上代码中,实际上的就是在作为new Promise的函数参数的函数体中去完成的。

    let a = new Promise((resolve, reject)=>{
    
        //promise to do something here...
        
    })
    

    规定了,你既然执行承诺做某事,就一定要就结果,这个结果可以是成功(success),或者是失败了(falied)。 分别对应的就是resolve()reject()。 这两个方法的执行,都会返回对应的promise对象

    返回的promise对象中,为我们提供了一些方法,其中,当你的 “承诺” 执行成功了,并且触发了resolve(),则会返回一个对象,该对象提供了一个then()方法,你可以在该方法中去做一些逻辑操作。
    对应的,就是catch(),用于捕获异常,该方法是由 “承诺” 执行失败后抛出异常,返回的对应对象所提供的方法。
    promise中的.then,.catch的用法,被称为链式调用

    以上,是对promise的基本理解,以及基本使用。

    但是目前,我们还是没有体会到,promise,到底解决了怎样的一种需求

    它其实解决了我们有时候在执行多个异步操作的时候,但是由于对其它异步操作的返回值有依赖,因此需要按照特定的顺序时候,就可以使用promise来实现我们期望的异步执行顺序和规则。 简单的说,我们需要让多个异步执行的操作 同步执行。

    例如,Ajax请求是异步执行的,现在假如有两个Ajax请求,a和b,假如,我需要利用b请求返回的结果作为a请求的参数,那么就必须先让b执行,且在接受到b的返回值后,再执行a请求。

    promise 实际上还是由 回调函数实现的。

    axios 就是一个很典型的promise 实现。

    以下是一个很简单的经典示例。

    setTimeout(()=>{
    	console.log("this is setTimeout() output !")
    },2000);
    console.log("I'm from China, and I love my country")
    
    # 输出
    $ node index.js
    I'm from China, and I love my country 
    this is setTimeout() output !   #(和上一条输出间隔2s);
    

    现在,利用promise,实现先打印“this is setTimeout() output !”,再打印“I'm from China, and I love my country ”

    let a = new Promise((resolve,reject)=>{
    	setTimeout(()=>{
    	console.log("this is setTimeout() output !")
    	resolve();
    	},2000);
    })
    
    a.then(()=>{
    	console.log("I'm from China, and I love my country")
    })
    
    
    # 输出
    $ node index.js
    this is setTimeout() output !
    I'm from China, and I love my country
    

    回头看看文章开头的引用

  • 相关阅读:
    前言(CSDN也有Markdown了,好开森)
    One usage of recurison: the tower of Hanoi
    使用Android注解来改善代码
    mysql生产环境____主从同步修复案例
    不同类型的指针
    C++ 对象模型
    为什么需要模版成员方法
    理解 traits
    C++ 异常处理
    传const引用代替传值
  • 原文地址:https://www.cnblogs.com/jaycethanks/p/13061481.html
Copyright © 2020-2023  润新知