let promise = new Promise(function(resolve, reject) {
setTimeout(() => reject(new Error("Whoops!")), 1000);
});
// reject runs the second function in .then
promise.then(
result => alert(result), // doesn't run
error => alert(error) // shows "Error: Whoops!" after 1 second
);
在上面的代码片段中,尽管我调用了reject,但promise状态已解析,但当我从promise.then
中删除error => alert(error)
时,我将promise状态设置为rejected如果有人叫拒绝,那么承诺状态应该被拒绝而不是解决,我是对的吗?
解析的promise不是原来的promise,而是then
返回的promise。最初的承诺确实被拒绝了,您可以通过console.log(promise)
进行验证。但因为你锁住了then
,它会返回另一个承诺。。
返回值[
then
]处于挂起状态的
Promise
。处理程序函数(onFulfilled
或onRejected
(然后异步调用(尽快因为堆栈是空的(。在调用处理程序函数之后,如果处理程序函数:
- 返回一个值,
then
返回的promise将通过返回值作为其值- 不返回任何内容,则
then
返回的promise将被解析为undefined
值- 抛出错误,然后返回的promise将被抛出的误差作为其值
。。。
第二点适用于您的案例。你可以通过观察Promise.reject().then(undefined, ()=>{})
返回用undefined
值解析的promise。
您也可以像下面的一样以"then-catch"的方式处理Promises
let promise = new Promise(function(resolve, reject) {
setTimeout(() => reject('Error'));
});
promise
.then(result => console.log('Result ', result))
.catch(error => console.log('This is Error message -', error))
在您的案例中,承诺的最终状态也被拒绝。试试console.log(promise(;它与错误无关=>警报(错误(
您发布的代码似乎在Chrome和Firefox上都能正常工作——Promise不出所料被拒绝了。reject
函数将Promise标记为已拒绝-然后,您可以通过将回调函数传递到then
的第二个参数中或使用catch
方法来对拒绝做出反应。这两种方法都是正确的。
如果遇到任何意外行为,请验证是否使用了替换原始Promise
对象的错误polyfill。
参考:Promise.prototype.then,Promise.prottype.catch