Promise解析

作者&投稿:冉阅 (若有异议请与网页底部的电邮联系)
~ Promise说明

它是一个ES6提出一个新语法,用来优化异步代码的写法。

promise:承诺,是用来表述对将来要发生的事情的肯定在ES6中,它是新增的构造器(Array,Object,Promise),用来优化实现异步操作。在没有它之前,javascript中的异步处理,大多是利用回调函数来实现的。典型的几种如下:(1)setTimeout(2)ajax(3)nodejs中的文件读取。现在有了promise,就可以对这些异步操作进行改写了。

Promise的基本使用

Promise是承诺的意思,es6中提出一个新api。

用来优化异步代码。它的经典使用方式如下

var?p1?=?new?Promise(function(resolve,reject){?????//异步操作?resolve(obj1)??或者?reject(obj2)});p1.then(function(rs){????//?如果p1的状态是resolved,则then中的函数????//会执行,且obj1的值会传给rs}).catch(function(rs){????//?如果p1的状态是reject,则catch中的函数????//????会执行,且obj2的值会传给rs}).finally(function(){????//?一定会执行的函数})

构造器const?p1?=?new?Promise(function(resolve,reject){??//?执行异步代码??//?调用resolve,或者reject});console.dir(p1)

要点:

构造器必须要给定一个参数,如果不给就是会报错。例如,newPromise()报错的信息是:Promiseresolverundefinedisnotafunction

构造器的实参是一个函数,这个函数的特殊之处在于它有两个形参(resolve,reject),这两个形参也是函数。在格式上,也可以采用箭头函数来改写。例如:varp1=newPromise((resolve,reject)=>{})。

在函数体的内部,一般会执行异步代码,然后根据情况来调用resolve()或者是reject()。调用resolve或者是reject后会产生什么样的后果,在后面小节介绍。当然了,再次强调一下resolve和reject只是形参名,可以改写成其它的。

三种状态和值

一个Promise对象的状态可能是如下三种之一:pending,resolved(fulfilled),rejected。下面分别介绍。

初始态pending

pending。它的意思是"待定的,将发生的",相当于是一个初始状态。创建Promise对象时,且没有调用resolve或者是reject方法,相当于是初始状态。这个初始状态会随着你调用resolve,或者是reject函数而切换到另一种状态。

var?p?=?new?Promise((resolve,rejectok)=>{?console.info('发呆.....'?)})console.dir(p)

这个初始状态就是你对别人说出承诺的那个瞬间,此时,大家都不知道这个承诺是否能兑现。

成功态resolve

也有叫fulfilled的。

resolved。表示解决了,就是说这个承诺实现了。要实现从pending到resolved的转变,需要在创建Promise对象时,在函数体中调用了resolve方法(即第一个参数)。

var?p?=?new?Promise((resolve,reject)=>{?resolved();})console.dir(p)

失败态reject

rejected。拒绝,失败。表示这个承诺没有做到,失败了。要实现从pending到rejected的转换,只需要在创建Promise对象时,调用reject函数。

var?p?=?new?Promise((resolve,reject)=>{?reject()}?)console.dir(p)

三种状态小结

状态是可转化。

最初创建promise对象时,默认状态是pending,如果在函数体内部调用了第一个参数对应的函数,则状态变成了resolved;如果调用了第二个参数对应的函数,则状态变成了rejected。

状态转换是不可逆的。

一旦从pending--->resolved(或者是rejected),就不可能再回到pending,也不能由resolved变成rejected。

promise的值

一个promise对象除了状态之外,还有promiseValue。在构造器中,这个值在调用resolve和reject方法时传入。

var?p?=?new?Promise(?(resolve,reject)?=>?{?resolve(123);?}?);//??此时,prommise对象p的状态是?resolved,值是123。console.dir(p)

var?p?=?new?Promise(?(resolve,reject)?=>?{?reject(123);?}?);//??此时,prommise对象p的状态是?rejected,值是123console.dir(p)

promise的兑现

在构造器的函数体中,一旦状态发生了变化,就会进行then,或者是catch中去,同时把promiseValue传入对应的函数。

具体来说:

状态从pending变成resolved,进入then中,调用函数,并传入此时的promiseValue(就是调用resolve时传入的实参)

状态从pending变成rejected,进入catch中,调用函数,并传入此时的promiseValue(就是调用reject时传入的实参)

根据实际情况的需要,也可以不加上finally()。

then的格式及执行逻辑then的格式作用

then方法的作用是为Promise对象添加状态改变时的回调函数。

then的格式

它有两个参数,每个参数都是函数。第二个参数是可选的。

//?p?是一个promise对象p.then(函数1[,函数2])

它的两个参数都是函数。

第一个参数是resolved状态的回调函数。当p的状态从pending变成了resolved,函数1会执行。

第二个参数是rejected状态的回调函数。当p的状态从pending变成了rejected,函数2会执行。

其中第二个参数是可选的,如果只写一个参数的话就是如下:

promise对象.then(函数1)

执行逻辑

以如下代码为例

var?p?=?new?Promise((resolve,reject)=>{???//??resolve(val1);???reject(val2)})p.then(????okVal=>{????????console.info("成功");????????console.log(okValue);????????},?????errVal=>{????????console.info("失败");????????console.log(errValue);????})

它的两个参数都是函数,其执行逻辑是:

如果promise对象的状态是resolved,则then()会执行第一个函数,并传入当前的PromiseValue(即上面的val1);

如果promise对象的状态是rejected,则then()会执行第二个函数,并传入当前的PromiseValue(即上面的val2);

特别地,如果promise对象的状态是rejected,且此时then方法并没有设置第二个参数,就会向外抛出一个错误,错误的提示大约是Uncaught(inpromise)。

then的返回值

then()方法的返回值也是一个promise对象,所以它支持链式写法。但是要注意的是它的返回值是一个新的promise对象,与调用then方法的并不是同一个对象。

看如下代码

const?p1?=?new?Promise(function(resolve,reject){??//?执行异步代码??//?调用resolve,或者reject});console.dir(p1)0

如上代码可以说明p1.then()的结果是一个与p1不同的promise对象。换句话说,then()会封装一个全新的promise对象p2。那既然p2也是一个promise对象,那么,p2的状态(promiseStatus)和值(promiseValue)分别是什么?

p2的状态及promiseValue如何确定?

p2的状态及promiseValue按如下规则来确定

如果p1的状态是pending,则p2的状态也是pending。

如果p1的状态是resolved,then()会去执行f_ok,则p2的状态由f_ok的返回值决定。

如果f_ok返回值不是promise对象,则p2的状态是resolved,且p2的promiseValue就是f_ok函数的return值。

如果f_ok返回值是一个promise对象,则p2的状态及promiseValue以这个promise对象为准。

如果f_ok这个函数内部发生了错误(或者是用户主动抛出错误),则p2的状态是rejected,且p2的promiseValue就是这个错误对象。

如果p1的状态是rejected,then()会去执行f_err,则p2的状态由f_err的返回值决定。

如果f_err返回值不是promise对象,则p2的状态是resolved,且p2的promiseValue就是f_err函数的return值。

如果f_err返回值是一个promise对象,则p2的状态及promiseValue以这个promise对象为准。

如果f_err这个函数内部发生了错误(或者是用户主动抛出错误),则p2的状态是rejected,且p2的promiseValue就是这个错误对象。

catch的格式及用法

catch是then(null,reject)的别名

catch()的格式及用法

Promise.prototype.catch是Promise.prototype.then(null,reject)的别名,用于指定当promise对象的状态从pending变成rejected的回调函数。

const?p1?=?new?Promise(function(resolve,reject){??//?执行异步代码??//?调用resolve,或者reject});console.dir(p1)1

catch的返回值

catch的返回值仍是一个promise对象,确定它的值的方式与then(null,(errVal)=>{})的方式一致。

promise的链式调用const?p1?=?new?Promise(function(resolve,reject){??//?执行异步代码??//?调用resolve,或者reject});console.dir(p1)2

结果输出是:任务1,任务2,任务3,任务4

分析const?p1?=?new?Promise(function(resolve,reject){??//?执行异步代码??//?调用resolve,或者reject});console.dir(p1)3

第一步:由于p的状态是resolved,所以p.then(do1)中,do1函数会执行。输出任务1。

第二步:确定p1的状态。按前面关于then的部分的介绍,p1的状态由do1()来决定。因为do1并没有明确指定返回值,则返回值就是undefined.p1的状态就是resolved。

第三步:由于p1的状态是resolved,所以p1.then(do2)会继续执行do2。输出任务2,且p2的状态由do2来决定。与第二步的分析相同,p2的状态仍是resolved。

第四步:接下来看p3。由于p2的状态是resolved,所以p2.then(do3)会继续执行do3。输出任务2,且p3的状态由do3来定,仍是resolved。

最后:p3.then(do4)。由于p3的状态是resolved,所以执行do4。输出任务4。




前端数据请求方式—Fetch的使用
1. Fetch API简介:Fetch是浏览器提供的内置API,用于处理网络请求,无需依赖额外的库。它支持Promise处理,无论请求成功或失败,都会返回一个Promise对象。2. fetch()方法使用:通过fetch(url)发起请求,参数是请求路径,返回的Promise解析为Response对象。如:fetch('gitee.com\/api\/v5\/users\/...')....

年高考二轮专题训练:名词
promise C. plan D. contribution 答案:B 解析:语境说这个年轻人向父母保证\/承诺,他毕业后会自食其力。Make a promise表示“许诺”。其他选项的含义:A“预测”,C“计划”;D“贡献”。, 16. (2008湖北) The top leaders of the o countries are holding talks in a friendly ___. A. atmosphere B. ...

英语问题。
2.Last Sunday he made a promise ___ he was free he would take me to DALIAN.A.if B.that C,that if D.whether 选C 这是一句同位语从句套一句条件状语从句 【made a promise that...】是一句同位语从句,内容起到解释说明的作用 后面一句是条件状语从句【if he was free he would...

知识讲解:2016考研英语语法指导——如何区分考研英语中的定语从句与同位...
解析:①是同位语从句,是对order的具体解释,that虽不作成分,不能换为which, 也不能省略。②是定语从句,是名词order的修饰语,that在从句中作received的宾语,可以换为which,也可以省略。ii. how, whether, what虽不能引导定语从句,却可引导同位语从句;who, whose, whom, which, when, where...

2021前端高级面试题?
解析:第41题 比如sleep(1000)意味着等待1000毫秒,可从Promise、Generator、Async\/Await等角度实现 解析:第42题 解析:第43题 1、客户端使用https的url访问web服务器,要求与服务器建立ssl连接 2、web服务器收到客户端请求后,会将网站的证书(包含公钥)传送一份给客户端 3、客户端收到网站证书后会检查证书的颁发机构...

动词不定式做宾补例句
2、作主语,此种结构在同学们的日常学习中常出现,是历年的高频考点。例如:To master a language is not easy thing。掌握一门语言不是件容易的事情。解析:To master a language是动词不定式做句子的主语,is是句子的谓语动词,not是否定谓语动词部分,easy thing是句子的其他成分。

解析XML数据:使用xml2js库轻松进行XML解析
无论是JavaScript还是CoffeeScript,xml2js都提供了清晰易懂的使用示例。对于更复杂的选项设置,它也提供了丰富的参数选项。从0.1.11版本起,xml2js还提供了无需事件监听器的处理方式,增加了代码的简洁性。无论是通过解析器实例还是直接调用库函数,xml2js的parseStringPromise方法都能轻松解析XML,处理...

时政常用英语短语及解析
If you stand by an earlier decision, promise, or statement, you continue to support it or keep it 坚持 (原有的决定、承诺或声明) 例: The decision has been made and I have got to stand by it 这个决定已经作出,我得坚持它。 坚定维护自身在南海的主权和相关权利 We firmly stand by our sover...

...as引导的时间状语从句是怎么回事,请讲解一下。
〔解析〕 题干中的直接引语较为复杂, 根据“promise”的提示, 该直接引语应表示一种假设, 意为: 你将不能拿回这足球, 直到你承诺不再把它踢向我的猫。 4. since引导的时间状语从句分析: since引导的时间状语从句表示“自从……以来”, 其用法主要有两种: (1) 现在完成时的主句+since引导的一般过去时态...

不定式不可以在句子中做什么成分
解析:pretend后应接不定式作宾语,其否定式是“not to do”,故选A。 二、不定式的定语功能 不定式作定语,被其修饰的名词为不定式所表动作的逻辑主语、逻辑宾语等。 例1:There are five pairs ___, but I’m at a loss which to buy. (上海1999) A. to be chosen B. to choose from C. to choose...

越西县13328729227: 英语翻译其中promise又作何解呢~ -
龚往塞替:[答案] 他特别有希望成为一个画家. promise 有希望

越西县13328729227: promise的中文意思是什么? -
龚往塞替: promisen. 1. 承诺,诺言[C][(+of)][+(that)][+to-v] Give me your promise that you'll never be late again. 答应我你绝不再迟到了. 2. 希望,前途[U][S] The young man shows promise as a poet. 这位青年有成为诗人的希望. vt. 1. 允诺,答应[+to-v][+...

越西县13328729227: promise的常用用法? -
龚往塞替:[答案] promise 的用法小节 promise KK:[] DJ:[] n. 1.承诺,诺言[C][(+of)][+(that)][+to-v] Give me your promise that you'll never be late again. 答应我你绝不再迟到了. 2.希望,前途[U][S] The young man shows promise as a poet. 这位青年有成为诗人的希望. vt. 1....

越西县13328729227: promise是什么意思 -
龚往塞替: promise [英]ˈprɒmɪs [美]ˈprɑ:mɪs vt. 允诺,许诺;给人以…的指望或希望 vi. 许诺;有指望,有前途 n. 许诺;希望,指望;允诺的东西 [例句]As for the promise of three years of maternity leave , she feels this will be self-defeating ." 至于三年产假的承诺,她认为这将事与愿违.您好,答题不易 如有帮助请采纳,谢谢

越西县13328729227: promise的意思是什么? -
龚往塞替:[答案] promise ['prɔmis] 基本翻译 n.许诺,允诺;希望 vi.许诺;有指望,有前途 vt.允诺,许诺;给人以…的指望或希望 网络释义 Promise:求佛|承诺|承诺,允许 PROMISE ME:与我约定|答应我|答应我吧 Promise Technology:乔鼎资讯|乔鼎信息|乔鼎咨询

越西县13328729227: promise的用法,详细的 -
龚往塞替:[答案] ①promise to do sth承诺做某事 ②promise sb sth承诺某人某物 ③prmise that+从句 ④make promises/make a promise to sb向某人许诺

越西县13328729227: 【英语】promise的词性、用法、其他形式、其他形式的用法、词组 -
龚往塞替:[答案] promise vt.& vi. 1 允诺; 答应 I can't promise. 我不能应允. 2 有…希望; 预示 He promises highly. 他的前途远大. n. 1 承诺,诺言 I'd like to come with you but that's not a promise,don't rely on it. 我愿意和你一起去,但这不是允诺,别指望我一定去. 2希...

越西县13328729227: Promise 这个单词的解释? -
龚往塞替: promise n.诺言 vt.& vi.答应

越西县13328729227: promise 的中文意思?
龚往塞替: 用的最多的就是下面第一条解释,还有动词形式.. promise n. 1. 许诺, 诺言; 约定 Give me your promise that you'll never be late again. 答应我你绝不再迟到了. The young man shows promise as a poet. 这位青年有成为诗人的希望. 2. 许诺的东...

越西县13328729227: promise 的意思是什么
龚往塞替: 允诺,承诺

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网