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
即: var promise2 = promise1.then(onFulfilled, onRejected)表达式中promise2的状态跟promise1没有直接关系。
var promise2 = promise1.then(onFulfilled, onRejected)
promise2
promise1
// 创建promise1对象 var promise1 = new Promise((resolve, reject) => { reject('Rejected') }) // 创建promise2对象,来自`promise1.then`的返回值 var promise2 = promise1.then(value => { console.log(`[promise1]: fulfilled, value='${value}'`) }, reason => { console.log(`[promise1]: rejected, reason='${reason}'`) }) promise2.then(value => { console.log(`[promise2]: fulfilled, value='${value}'`) }, reason => { console.log(`[promise2]: rejected, reason='${reason}'`) })
输出:
[promise1]: rejected, reason='Rejected' [promise2]: fulfilled, value='undefined'
此DEMO中即使promise1变成了rejected,但是 promise2却是fulfilled状态。
rejected
fulfilled
promise2 = promise1.then(onFulfilled, onRejected)
onFulfilled
onRejected
如promise1是fulfilled(rejected)且没有onFulfilled(onRejected)回调函数,,此时promise2采用promise1的状态(即promise2的状态跟promise1的状态一致):
var promise1 = new Promise((resolve, reject) => { reject('Rejected') }) // promise1没有注册`onRejected`回调函数 var promise2 = promise1.then() promise2.then(value => { console.log(`[promise2]: fulfilled, value='${value}'`) }, reason => { console.log(`[promise2]: rejected, reason='${reason}'`) })
[promise2]: rejected, reason='Rejected'
var promise1 = new Promise((resolve, reject) => { resolve('Fulfilled') }) // promise1没有注册`onFulfilled`回调函数 var promise2 = promise1.then() promise2.then(value => { console.log(`[promise2]: fulfilled, value='${value}'`) }, reason => { console.log(`[promise2]: rejected, reason='${reason}'`) })
[promise2]: fulfilled, value='Fulfilled'
此时Reject promise2对象,并且把异常作为reason。
Reject
var promise1 = new Promise((resolve, reject) => { resolve('Fulfilled') }) // promise1的`onFulfilled`回调函数抛出了异常 var promise2 = promise1.then(() => { throw new Error('A Error in onFulfilled func') }) promise2.then(value => { console.log(`[promise2]: fulfilled, value='${value}'`) }, reason => { console.log(`[promise2]: rejected, reason='${reason}'`) })
[promise2]: rejected, reason='Error: A Error in onFulfilled func'
x
如果onFulfilled/onRejected函数正常执行完,且返回值是x(如果没有显示指定返回值,则x为undefined)。
undefined
var promise1 = new Promise((resolve, reject) => { resolve('Fulfilled') }) // promise1的`onFulfilled`回调函数返回`promise1`对象 var promise2 = promise1.then(() => { return promise1; }) promise2.then(value => { console.log(`[promise2]: fulfilled, value='${value}'`) }, reason => { console.log(`[promise2]: rejected, reason='${reason}'`) })
[promise2]: fulfilled, value='Fulfilled
此时promise2和promise1具有相同的状态和相同的value。
TypeError
上个规则成立的前提就是x和promise2不能相等,否则就会产生互相依赖的矛盾。 如果x和promise2相等,则抛出TypeError异常,并且作为promise2对象rejected状态的reason。
var promise1 = new Promise((resolve, reject) => { resolve('Fulfilled') }) // promise1的`onFulfilled`回调函数返回了`promise2` var promise2 = promise1.then(() => { return promise2; }) promise2.then(value => { console.log(`[promise2]: fulfilled, value='${value}'`) }, reason => { console.log(`[promise2]: rejected, reason='${reason}'`) })
[promise2]: rejected, reason='TypeError: Chaining cycle detected for promise #<Promise>'
则执行大致下面的流程:
var then = x.then; then.call(x, resolve, reject);
x.then
resolve(y)
[[Resolve]](promise, y)
y
rejected(y)
thenable
则promise2变成fulfilled,并且把x作为其value。 如同开头的DEMO中即使promise1变成了rejected,但是 promise2却是fulfilled状态。 因为promise1的onRejected回调函数的返回值x是undefined所以promise2的value是undefined。
即使promise1变成了
,但是 promise2却是
状态
The text was updated successfully, but these errors were encountered:
promsie.finally(onFinally)
promsie.then(onFinally, onFinally)
// Resolve var promise2 = Promise.resolve(2) .then( () => {}); promise2.then( value => { console.log(`Fulfilled, value=${value}`) // value是undefined }) var promise2 = Promise.resolve(2) .finally( () => {}); promise2.then( value => { console.log(`Fulfilled, value=${value}`) // value是2 }) // Reject var promise2 = Promise.reject(2) .then(() => {}, () => {}) // promise2 依旧是fulfilled promise2 .then(value => { console.log(`Fulfilled, value=${value}`) // // value是undefined }, reason => { console.log(`Rejected, reason=${reason}`) }) var promise2 = Promise.reject(2).finally(() => {}, () => {}); // promise2也变成rejected promise2 .then(value => { console.log(`Fulfilled, value=${value}`) }, reason => { console.log(`Rejected, reason=${reason}`) // reason是2 })
Promise.prototype.finally()
then
onFinally
Sorry, something went wrong.
No branches or pull requests
一、处于then链中Promise对象的状态跟其前一个Promise对象的状态没有直接关系
即:
var promise2 = promise1.then(onFulfilled, onRejected)
表达式中promise2
的状态跟promise1
没有直接关系。输出:
此DEMO中即使promise1变成了
rejected
,但是 promise2却是fulfilled
状态。1.2 分析
promise2 = promise1.then(onFulfilled, onRejected)
onFulfilled
还是onFulfilled
回调函数。onFulfilled
ORonRejected
回调函数影响:1. 如果没有
onFulfilled
/onRejected
回调函数:如promise1是
fulfilled
(rejected
)且没有onFulfilled
(onRejected
)回调函数,,此时promise2采用promise1的状态(即promise2
的状态跟promise1
的状态一致):输出:
[promise2]: rejected, reason='Rejected'
输出:
[promise2]: fulfilled, value='Fulfilled'
2. 如果
onFulfilled
/onRejected
执行过程中抛出了异常:此时
Reject
promise2对象,并且把异常作为reason。输出:
[promise2]: rejected, reason='Error: A Error in onFulfilled func'
3. 如果
onFulfilled
/onRejected
函数的返回值是x
如果
onFulfilled
/onRejected
函数正常执行完,且返回值是x
(如果没有显示指定返回值,则x为undefined
)。3.1 如果
x
也是个Promise对象,则promise2
采用x
的状态:输出:
此时
promise2
和promise1
具有相同的状态和相同的value。3.2 如果
x
和promise2
相等,则抛出TypeError
异常:上个规则成立的前提就是
x
和promise2
不能相等,否则就会产生互相依赖的矛盾。如果
x
和promise2
相等,则抛出TypeError
异常,并且作为promise2
对象rejected状态的reason。输出:
[promise2]: rejected, reason='TypeError: Chaining cycle detected for promise #<Promise>'
3.3 如果
x
是个thenable对象:则执行大致下面的流程:
x.then
内部先调用了resolve(y)
,则进行[[Resolve]](promise, y)
;此时会开启新的Promise解析过程,
y
千万不能和x
相等,否则会产生无限循环。x.then
内部先调用了rejected(y)
, 则promise2
也变成rejected
,并且把y作为reason;x.then
内部先抛了异常, 则promise2
也变成rejected
,并且把异常作为reason;3.4 其他情况(即
x
不是Promise对象,也不是thenable
对象):则
promise2
变成fulfilled,并且把x
作为其value。如同开头的DEMO中
即使promise1变成了
rejected,但是 promise2却是
fulfilled状态
。因为
promise1
的onRejected
回调函数的返回值x
是undefined
所以promise2
的value是undefined
。The text was updated successfully, but these errors were encountered: