promise.then返回的是一个新的 promise 对象
1、如果 then()
方法中抛出了一个异常,那么返回的 Promise
将会变成拒绝状态,value
是异常的 reason,如下例。
new Promise((resolve, reject) => {
if (true) {
resolve();
} else {
reject();
}
}).then((data) => {
resolve();
}, (error) => {
reject();
})
then 返回的 promise: {
[[promiseStatus]]: 'rejected',
[[promiseValue]]: 'ReferenceError: resolve is not defined at Promise.then'
}
为什么返回的是这个呢?
因为 resolve
是 undefined
,把它当做一个函数去调用当然会报错,所以就算没有 return
任何东西,此时的 then
返回的 promise
是 rejected
。而且,一般不能在 Promise.then()
中调用 resolve
和 reject
,除非你这样写:
new Promise((resolve, reject) => {
if (true) {
resolve(resolve); // 将 resolve 传递下去
} else {
reject();
}
}).then((data) => {
data(); // data 接收了 resolve 函数
})
在 then()
方法中抛出了一个异常
var promise2 = new Promise(function(resolve, reject) {
setTimeout(function() {
resolve('success');
}, 2000);
});
promise2.then(function(data) {
throw new Error('irene')
})
then 返回的 promise: {
[[PromiseStatus]]: "rejected"
[[PromiseValue]]: "Error: irene"
}
2、如果 then()
方法中 return
【普通】参数值,那么返回的 Promise
将会变成 resolved
,value
即是 return
的那个数据,如下例。
var promise2 = new Promise(function(resolve, reject) {
setTimeout(function() {
resolve('success');
}, 2000);
});
promise2.then(function(data) {
return 2
})
then 返回的 promise: {
[[PromiseStatus]]: "resolved"
[[PromiseValue]]: 2
}
3、如果 then()
方法中 return Promise
,那这个 Promise
是什么状态,then
返回的就是什么状态,如下例。
var promise2 = new Promise(function(resolve, reject) {
setTimeout(function() {
resolve('success');
}, 2000);
});
promise2.then(function(data) {
return new Promise(function(resolve, reject) { // 注意一定要写 return,否则就属于第4种情况了
reject('把状态置为rejected error');
});
})
then 返回的 promise: {
[[PromiseStatus]]: "rejected"
[[PromiseValue]]: "把状态置为rejected error"
}
4、如果 then()
方法中 return new Error('irene')
,那这个 Promise
是 resolved
,value
即是 new Error('irene')
,如下例。
new Promise((resolve, reject) => {
if (true) {
resolve();
} else {
reject();
}
}).then(() => {
return new Error('irene')
})
then 返回的 promise: {
[[promiseStatus]]: 'resolved',
[[promiseValue]]: Error: irene
}
5、如果 then()
方法中没有 return
任何东西,那么返回的 Promise
就是接收状态,value
是 undefined
,如下例。
new Promise((resolve, reject) => {
if (true) {
resolve();
} else {
reject();
}
}).then(() => {
console.log('resolve')
})
then 返回的 promise: {
[[promiseStatus]]: 'resolved',
[[promiseValue]]: undefined
}
6、try-catch
无法捕获 then()
中抛出的错误。因为先执行主线程代码,没有报错,所以 catch
不会打印;再执行微任务,也就是 then()
中的代码,此时报了错,由于主线程代码已经执行结束,所以不会 catch then()
中的报错。可以使用 await
解决这个问题。
try {
new Promise((resolve, reject) => {
if (true) {
resolve();
} else {
reject();
}
}).then(() => {
throw new Error('irene')
})
} catch (err) {
console.log(err) // 由于无法捕获,所以此处的无法打印
}
Uncaught (in promise) Error: irene
at <anonymous>:9:11
使用 await
,catch
中可捕获 then()
中抛出来的错误信息
try {
var a = await new Promise((resolve, reject) => {
if (true) {
resolve();
} else {
reject();
}
}).then(() => {
throw new Error('irene')
})
} catch (err) {
console.log(err)
}
// catch 中打印出来的信息,此时 a 是 undefined。
Error: irene
at <anonymous>:9:11
at async <anonymous>:2
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。