返回
Promise.reject
前端
2024-02-13 13:34:44
当然,让我们来梳理下reject决策:
首先我们来看看reject调用栈:
Promise.reject = function(arg) {
return new Promise(function(resolve, reject) {
reject(arg);
});
};
这里其实和resolve的函数很像,只不过reject将回调函数的reject参数调用了。
const p1 = Promise.reject(42);
p1.then(undefined, function(reason) {
console.log(reason); // 42
});
因为reason的传入,此时p1.state为"rejected",所以调用了onRejected的回调。
我们再来看下它所对应的流程:
var p2 = new Promise(function(resolve, reject) {
// 异步执行了一些任务
reject(42);
});
p2.then(undefined, function(reason) {
console.log(reason); // 42
});
由于reject方法是在构造函数里直接调用的,所以此时的p2.state也是"rejected",当然也执行了onRejected回调。
所以一般我们建议,执行reject的时候,把第一个参数是错误类型,第二个参数是错误信息:
function ajax(url) {
return new Promise((resolve, reject) => {
// 利用 fetch 发起异步请求
fetch(url)
.then(res => {
if (res.ok) {
resolve(res.json());
} else {
reject({
errorType: res.status,
errorMessage: res.statusText,
});
}
})
.catch(err => {
reject({
errorType: 'NetworkError',
errorMessage: err.message,
});
});
});
}
如此一来,在使用上也更为方便,直接获取这两个参数:
ajax('http://example.com/api/users')
.then(undefined, ({ errorType, errorMessage }) => {
console.log(errorType, errorMessage);
});