We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Promise 必须为以下三种状态之一:等待态(Pending)、执行态(Fulfilled)和拒绝态(Rejected)。一旦 Promise 被 resolve 或 reject,不能再迁移至其他任何状态(即状态 immutable)。
Promise
Pending
Fulfilled
Rejected
resolve
reject
基本过程:
pending
then(..)
then
promise
fn
onFulfilled
onRejected
Promise 最大的意义在于给予我们使用异步时丢失的 return、throw 和栈。
return
throw
在 Promise 中,返回任意一个非 promise 的值都会被包裹成 promise 对象,例如 return 2 会被包装为 return Promise.resolve(2)。
return 2
return Promise.resolve(2)
Promise 实例具有 then 方法,即 then 方法是定义在原型对象 Promise.prototype 上的,作用是给 Promise 实例添加状态改变时的回调函数。then 方法的第一个参数是 Resolve 状态的回调函数,第二个是 Rejected(可选)状态的回调函数。
Promise.prototype
Resolve
Promise.prototype.catch的方法是.then(null,rejection)的别名,用于指定发生错误的回调函数。
.finally()
resolved
rejected
Promise.all(iterable) 方法返回一个 Promise 实例,此实例在 iterable 参数内所有的 promise 都“完成(resolved)”或参数中不包含 promise 时回调完成(resolve);如果参数中 promise 有一个失败(rejected),此实例回调失败(reject),失败原因的是第一个失败 promise 的结果。
Promise.all(iterable)
iterable
Promise.race(iterable) 方法返回一个 promise,一旦迭代器中的某个 promise 解决或拒绝,返回的 promise 就会解决或拒绝,而其余的 promise 虽然依旧在执行,但是其结果会被抛弃。
Promise.race(iterable)
使用场景:可以用race给某个异步请求设置超时时间,并且在超时后执行相应的操作。
all 和 race 传入的数组中如果有会抛出异常的异步任务,那么只有最先抛出的错误会被捕获,并且是被 then 的第二个参数或者后面的 catch 捕获;但并不会影响数组中其它的异步任务的执行。
all
race
catch
Promise.allSettled() 方法返回一个 promise,该 promise 在所有给定的 promise 已被解析或被拒绝后解析,并且每个对象都描述每个 promise 的结果。
Promise.allSettled()
返回一个 fulfilled 的 Promise 实例,或原始 Promise 实例。
fulfilled
参数为空,返回一个状态为 fulfilled 的 Promise 实例 参数是一个跟 Promise 无关的值,返回一个状态为 fulfilled 的 Promise 实例,同时 fulfilled 响应函数会得到喝过参数 参数为 Promise 实例,则返回该实例,不做任何修改。 参数为 thenable,立刻执行它的 .then()
thenable
.then()
返回一个 rejected 的 Promise 实例。
与 Promise.resolve() 大体类似,除了 Promise.reject() 不认 thenable
Promise.resolve()
Promise.reject()
总结:
.then
.catch
error
.finally
Promise 能够链式调用的原理,即:promise 的 then/catch 方法执行后会也返回一个 promise。
then/catch
let getJSON=function(url){ let promise=new Promise(function(){ let client=new XMLHttpRequest() client.open('GET',url) client.onreadystatechange=hander cilent.responseType='json' client.setRequestHeader('Accept',"application/json") client.send() function hander(){ if(this.readystate!=4){ return } if(this.statues===200){ resolve(this.response) }else{ reject(new Error(this.stautsText)) } } }) return promise } //使用 getJSON('/xxx/xx.json').then((json)=>{ console.log('contents'+json) },(error)=>{ console.log("请求出错"+error) })
The text was updated successfully, but these errors were encountered:
No branches or pull requests
基础
Promise
必须为以下三种状态之一:等待态(Pending
)、执行态(Fulfilled
)和拒绝态(Rejected
)。一旦Promise
被resolve
或reject
,不能再迁移至其他任何状态(即状态 immutable)。基本过程:
Promise
状态(pending
)then(..)
注册回调处理数组(then
方法可被同一个promise
调用多次)Promise
中传入的fn
函数,将Promise
内部resolve
、reject
函数作为参数传递给fn
,按事件机制时机处理Promise
中要保证,then
方法传入的参数onFulfilled
和onRejected
,必须在then
方法被调用的那一轮事件循环之后的新执行栈中执行。Promise
最大的意义在于给予我们使用异步时丢失的return
、throw
和栈。在
Promise
中,返回任意一个非promise
的值都会被包裹成promise
对象,例如return 2
会被包装为return Promise.resolve(2)
。方法
Promise.prototype.then()
Promise
实例具有then
方法,即then
方法是定义在原型对象Promise.prototype
上的,作用是给Promise
实例添加状态改变时的回调函数。then
方法的第一个参数是Resolve
状态的回调函数,第二个是Rejected
(可选)状态的回调函数。Promise.prototype.catch()
Promise.prototype.catch的方法是.then(null,rejection)的别名,用于指定发生错误的回调函数。
Promise.prototype.finally()
.finally()
方法不管Promise
对象最后的状态如何都会执行.finally()
方法的回调函数不接受任何的参数,也就是说在.finally()
函数中是没法知道Promise
最终的状态是resolved
还是rejected
的Promise
对象值,不过如果抛出的是一个异常则返回异常的Promise
对象Promise.all()
Promise.all(iterable)
方法返回一个Promise
实例,此实例在iterable
参数内所有的promise
都“完成(resolved
)”或参数中不包含promise
时回调完成(resolve
);如果参数中promise
有一个失败(rejected
),此实例回调失败(reject
),失败原因的是第一个失败promise
的结果。Promise.race()
Promise.race(iterable)
方法返回一个promise
,一旦迭代器中的某个promise
解决或拒绝,返回的promise
就会解决或拒绝,而其余的promise
虽然依旧在执行,但是其结果会被抛弃。all
和race
传入的数组中如果有会抛出异常的异步任务,那么只有最先抛出的错误会被捕获,并且是被then
的第二个参数或者后面的catch
捕获;但并不会影响数组中其它的异步任务的执行。Promise.allSettled()
Promise.allSettled()
方法返回一个promise
,该promise
在所有给定的promise
已被解析或被拒绝后解析,并且每个对象都描述每个promise
的结果。Promise.resolve()
返回一个
fulfilled
的Promise
实例,或原始Promise
实例。Promise.reject()
返回一个
rejected
的Promise
实例。总结:
.then
和.catch
都会返回一个新的Promise
catch
不管被连接到哪里,都能捕获上层未捕捉过的错误Promise
的.then
或者.catch
可以被调用多次, 但如果Promise
内部的状态一经改变,并且有了一个值,那么后续每次调用.then
或者.catch
的时候都会直接拿到该值.then
或者.catch
中return
一个error
对象并不会抛出错误,所以不会被后续的.catch
捕获.then
或.catch
返回的值不能是promise
本身,否则会造成死循环.then
或者.catch
的参数期望是函数,传入非函数则会发生值透传.then
方法是能接收两个参数的,第一个是处理成功的函数,第二个是处理失败的函数,再某些时候你可以认为catch
是.then
第二个参数的简便写法.finally
方法也是返回一个Promise
,他在Promise
结束的时候,无论结果为resolved
还是rejected
,都会执行里面的回调函数链式调用
Promise
能够链式调用的原理,即:promise
的then/catch
方法执行后会也返回一个promise
。实现 Ajax
参考资料
The text was updated successfully, but these errors were encountered: