当第一个请求执行到error的时候中断后面的then执行
一个被 reject 的 promise, 后续的 then queue 都不会执行。。。
也就是说, 你的代码中执行了 reject handler, 其他的 fulfill handler 都不会执行。
express的话可以用这个 https://cnodejs.org/topic/56f6260487688ffc6e356e7c generator的错误处理还是比较直观的, 用 try catch 将 yield 操作包住即可。
sorry, 确实是这样,我之前理解有误 2 & 3都执行了。。。
通过这个 https://cnodejs.org/topic/5603cb8a152fdd025f0f5014, 以及 https://segmentfault.com/a/1190000002452115 提到(2.2.7.1 & 2.2.7.2)
如果onFulfilled 或 onRejected 返回了值x, 则执行Promise 解析流程[[Resolve]](promise2, x). 如果onFulfilled 或 onRejected抛出了异常e, 则promise2应当以e为reason被拒绝。
你只需要将 reject的err再次抛出既可,验证
对应的,你需要
@William17 帮看下这个
貌似node这边是不符合这条的 https://promisesaplus.com/#point-49 就是我在catch里面返回了一个 rejected的Promise as x. 然后以这个 resolve(p, x). 然后执行了下面的then, 这有问题吧?
@magicdawn Promise 应该没问题. 那个"逗号表达式", Promise.reject(_)
被当做第二个参数传给catch
了
> Promise.reject(new Error('boom')).catch(_ => {console.log(1, _); return Promise.reject(_)}).then(console.log.bind(console, 2));
Promise { <pending> }
> 1 [Error: boom]
> Promise.reject(new Error('boom')).catch(_ => console.log(1, _), Promise.reject(_)).then(console.log.bind(console, 2))
Promise { <pending> }
> 1 [Error: boom]
2 undefined
楼主这个应该把出error handler放最后catch
obj.getInfo()
.then(function(body){})
.then(function(data){})
.catch(error){
});
这个问题确实无解,只能嵌套then,抛异常或者reject不好。
if (false) {
return;
}
//其他业务逻辑
对应promise
foo().then((data)=>{
//if (false)
if (!data) {
return false;
} else {
return foo1(data)
.then((data)=>{
})
}
})
.then((data)=>{
})
.catch((err)=>{
})
返回的时候使用一个中间件,将不同类型的错误全部丢到这里,统一在这里处理。
exports = module.exports = function () {
return function (req, res, next) {
res.wrap = function wrap(raw) {
if (res.headersSent) return
var data = {request: req.originalUrl};
switch (true) {
//自定义错误类型
case raw instanceof MyError.self:
data.code = raw.code;
data.message = raw.message;
break;
//原始错误类型
case raw instanceof Error:
data.code = -1;
data.message = raw.toString();
break;
//常规数据
default :
data.code = 0;
data.data = raw;
}
res.send(data);
};
next()
}
};
示例:
foo().then((data)=>{
//if (false)
if (!data) {
return res.wrap(new MyError('xxxxxx'));
} else {
return foo1(data)
.then((data)=>{
})
}
})
.then((data)=>{
})
.catch((err)=>{
res.wrap(err);
})