promise的方法有哪些,promise什么用法

http://www.itjxue.com  2023-01-07 02:44  来源:未知  点击次数: 

Promise的实现

我们都知道promise 有三种状态

并且promise 的状态是不可逆的

每一个 Promise 都有两个 函数参数,分别是

通过查看 Promise 我们可以发现 resolve,reject,all,race是静态方法,then,catch,finally是实例方法。

通过以上的分析,我们 Promise 基本结构已经明朗了

我们 new 一个promise的时候都是直接执行,这个执行的函数就是 executor。而他有两个函数参数,分别是resolve,reject。而又因为我们状态是不可逆的,所以只能是在PENDING 状态下执行。

对于promise 而言,throw也应该被监听到(reject),所以我们需要在执行 executor的时候,加一个 try catch。

所以我们将constructor 里面的代码做了如下的改变

then方法会接收两个方法,onfulfilled, onrejected。而当status状态被改变后,onfulfilled, onrejected才应该被执行。同时onfulfilled,onrejected 是 可选参数

这个时候我们的promise已经完成了一班。我们可以执行promise函数,可以调用他的then方法,并且在then中也可以拿到他的值。非常完美。

但是这远远不够,接下来就让我们思考一下then的特性,让我们一起完善他!!!

也就是说,异步情况下,执行then的时候,状态依旧是pending,

同时,promise会有如下的调用情况

异步时间到了之后,我们就需呀继续这个数组(发布)

为了达成链式,我们需要在then里返回一个promise。类似于递归。

同时呢,我们的then还有这样一个特性。遇到非promise类型的时候是直接resolve返回的,遇到promise类型的,会进行判断。因为我们的then的四个运行地方都会用到这个函数。我们将其提取出来。

这一块的代码是按照 Promise/A+ ()规范写的。也就不需要仔细说了

这个时候then函数变成了如下的状态

聪明的你肯定发现了promise2本生就是一个异步的,我们调用resolvePromise(promise2,x,resolve,reject) 时,promise2为空。那么我们也将其变成异步即可。同时为了防止这一步有错,加一个try catch

我们的resolve,reject会将传入的值,返回一个新的promise

但是如果传入的值本身就是promise类型的,那么直接返回即可。

all()

所有的传入一个数组,每个都正常返回,即返回resolve,反之reject。同时因为数组中存在异步执行的情况,我们需要写一个promiseAdd函数来计算当前promise完成进度。

race()

只要有一个实例率先改变状态,新的MyPromise的状态就跟着改变

catch就相当于调用了then方法,走的是onrejected状态

无论成功还是失败,均会执行。同时 finally() 并不是结束,他依旧可以返回一个promise

Promise的使用

promise? 英?['pr?m?s]??美?['prɑm?s]

[ 过去式 promised 过去分词 promised 现在分词 promising ]

1、promise? 作为名词,意思是许诺,允诺;希望

【例】You have my promise. 给你我的承诺。

2、promise? 作为及物动词,意思是允诺,许诺;给人以?的指望或希望

【例】But?you?need to?show?him.?Promise?me. 但你一定要表现给他看,答应我。

3、promise作为不及物动词,许诺,承诺,保证

promise 侧重表自己的主观意向,设法用语言使人感到稳当可靠,所以很多“I promise...”的句型。

[ + that ] The government have?promised?that they'll reduce taxes.

政府已承诺要减税。

[ + (that) ]?Promise?me (that) you won't tell him.

答应我你不会告诉他。

4、promise to do sth 承诺去做某事

【例】I?promise?to?do?all?these?things. 我许诺做所有这些事情。

扩展资料:

例句

(1)He?faithfully?lived up to?his?promise.

他忠实地实践了他的诺言。

(2)I?redeemed?my?promise?to my?daughter?by?sending?her?a?gift?on?herbirthday.

女儿生日那一天我送给她一件礼物,履行了我对她的诺言。

(3)If?you?make a?promise,?abide?by it.

你如果做出诺言,就要履行诺言。

(4)One?should?keep to?one's?promise.

(5)You?have to?remember?your?promise.

你要记住你的承诺。

(6)Only?promise?me?that?you?will?smile.?

不过您得答应我,您一定要笑。

(7)Promise?what I?tell?you!?

答应我对你提出的要求!

Promise的用法以及作用

??Promise是一种常用的异步解决方案,解决回调地狱的问题。

??Promise可以解决两个问题:

??Promise发送的请求会经历三个过程:padding(进行中)、fullfilled(成功)、rejected(失败)。当状态决定后就不会在改变,这个时候就会把状态改为resolved(已定型)

??我通常配合vue和axios进行使用。

Promise有以下函数:

通常"Promise.resolve().then(f) "用这种方式把f变成符合promise的函数,但是如果f是同步函数这就会导致f只会在本段程序的末尾执行,有两种写法可以解决这个问题。

??方法一:第一种写法是用async函数来写。

??方法二:第二种写法是使用new Promise()。

p.try()就是解决以上的执行方式的痛点 Promise.try 为所有操作提供了统一的处理机制,所以如果想用 then 方法管理流程,最好都用 Promise.try 包装一下。这样有 许多好处 ,其中一点就是可以更好地管理异常。

promise函数详解

复制到你的vscode上看

//promise最核心的思想:用同步的流程解决异步的操作

//Promise 构造函数接受一个函数作为参数,该函数的两个参数分别是 resolve 方法和 reject 方法。

let promise =new Promise((reject,resolve)={

})

//如果异步操作成功,则用 resolve 方法将 Promise 对象的状态,从 pending 变为 resolved,并且向外传递执行成功后的数据;

//如果异步操作失败,则用 reject 方法将 Promise 对象的状态,从 pending 变为 rejected,并且向外传递执行失败后的数据

//promise的then方法可以接收resolve和reject传过来的数据 ;then方法有两个是回调函数的参数,分别对应resolve和reject

return new Promise((reject,resolve)={

}).then((data)={

//data参数是自定义的

console.log('resolve:'+data)

},(err)={

//err参数是自定义的

console.log('reject:'+data)

})

//每个 Promise 都会提供一个 then() 函数,和一个 catch(),实际上是 then(null, ...) 函数

// 我们可以在then()中做三件事,

// 1. return 另一个 promise

// 2. return 一个同步的值 (或者 undefined)

// 3. throw 一个同步异常 throw new Eror('');

// 为什么要有Promise函数?

function a(param){

setTimeout(() = {

return '异步操作'+param

}, 1000);

}

console.log(a(1))

//这里输出的是undefined,因为执行a函数时,还没有执行return

//可以通过回调函数实现异步输出

function a(param,callback){

param =param+1

setTimeout(() = {

param =param+1

// return '异步操作'+param

callback('异步操作:'+param)

}, 1000);

}

console.log(a(1,function(a){

console.log(a+' 211')

}))

//这里function(a){...}实际上是在settimeout中执行的。所以settimeout那个延迟了的一秒不能影响他

//虽然回调函数可以解决这个问题,假设我们需要在异步操作1执行后,执行异步操作2;异步操作2执行后执行异步操作3,这样层层嵌套

//那么就会陷入回调地狱,所以我们使用Promise函数解决异步执行问题。

return new Promise((reject,resolve)={

setTimeout(() = {

resolve({a:1,b:2,c:'这是异步操作成功resovle返回的数据'})

reject('异步操作失败1')

}, 1000);

}).then((data)={

//data参数是自定义的

console.log('resolve:'+data)

},(err)={

//err参数是自定义的

console.log('reject:'+data)

})

(责任编辑:IT教学网)

更多

推荐Flash actionscript文章