whynotgonow 2020-06-07
英文 | 中文翻译 |
---|---|
Promise | 承诺 |
resolve | 解决 |
reject | 故障 |
Promise
是一个对象,它代表了一个异步操作的最终完成或者失败。本质上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对象
中,为我们提供了一系列方法,其中,then()
是当你的 “承诺” 执行成功了,并且触发了resolve()
,所返回的对象中提供的一个方法,你可以在该方法中去做一些逻辑操作。对应的就是catch()
,用于捕获异常,该方法由 “承诺” 执行失败,抛出异常,返回的对应对象所提供的方法。
以上,是对promise的基本理解,以及基本使用。
但是目前,我们还是没有体会到,promise,到底解决了怎样的一种需求。
它其实解决了我们有时候在执行多个异步操作的时候,但是由于对其它异步操作的返回值有依赖,因此需要按照特定的顺序时候,就可以使用promise来实现我们期望的异步执行顺序和规则。 简单的说,我们需要让多个异步执行的操作,同步执行。promise中的.then
,.catch
的用法,被称为链式调用
。
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
回头看看文章开头的。