当第一个请求执行到error的时候中断后面的then执行
reject方法
同上,这两天写这个也遇到这个问题了
一个被 reject 的 promise, 后续的 then queue 都不会执行。。。
也就是说, 你的代码中执行了 reject handler, 其他的 fulfill handler 都不会执行。
1 跟 2只会执行一个,然后如果执行的是 2, 那么3也不会执行
express的话可以用这个 https://cnodejs.org/topic/56f6260487688ffc6e356e7c generator的错误处理还是比较直观的, 用 try catch 将 yield 操作包住即可。
@magicdawn 现在走到2后直接就执行3了
@wtwei
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再次抛出既可,验证
对应的,你需要
我只想说 generator / co 大法好。。。
E文标准在这 https://promisesaplus.com/#point-42
@William17 帮看下这个
貌似node这边是不符合这条的 https://promisesaplus.com/#point-49 就是我在catch里面返回了一个 rejected的Promise as x. 然后以这个 resolve(p, x). 然后执行了下面的then, 这有问题吧?
我用BlueBird 直接 throw new Error()
@magicdawn Promise 应该没问题. 那个"逗号表达式", Promise.reject(_)被当做第二个参数传给catch了
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)=>{ })
@William17 你这个方法好像可以的,第一个error后直接到catch了,谢谢!
13楼暂时解决了我的问题,谢谢大家的回复
返回的时候使用一个中间件,将不同类型的错误全部丢到这里,统一在这里处理。
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); })
@luoyjx 嗯,统一处理比较好
@William17
原来如此,这个是 => 比 , 优先级高…
CNode 社区为国内最专业的 Node.js 开源技术社区,致力于 Node.js 的技术研究。
reject方法
同上,这两天写这个也遇到这个问题了
也就是说, 你的代码中执行了 reject handler, 其他的 fulfill handler 都不会执行。
1 跟 2只会执行一个,然后如果执行的是 2, 那么3也不会执行
express的话可以用这个 https://cnodejs.org/topic/56f6260487688ffc6e356e7c generator的错误处理还是比较直观的, 用 try catch 将 yield 操作包住即可。
@magicdawn 现在走到2后直接就执行3了
@wtwei
sorry, 确实是这样,我之前理解有误
2 & 3都执行了。。。
通过这个 https://cnodejs.org/topic/5603cb8a152fdd025f0f5014, 以及 https://segmentfault.com/a/1190000002452115 提到(2.2.7.1 & 2.2.7.2)
你只需要将 reject的err再次抛出既可,验证
对应的,你需要
我只想说 generator / co 大法好。。。
E文标准在这 https://promisesaplus.com/#point-42
@William17 帮看下这个
貌似node这边是不符合这条的 https://promisesaplus.com/#point-49 就是我在catch里面返回了一个 rejected的Promise as x. 然后以这个 resolve(p, x). 然后执行了下面的then, 这有问题吧?
我用BlueBird 直接 throw new Error()
@magicdawn Promise 应该没问题. 那个"逗号表达式",
Promise.reject(_)被当做第二个参数传给catch了楼主这个应该把出error handler放最后catch
这个问题确实无解,只能嵌套then,抛异常或者reject不好。
对应promise
@William17 你这个方法好像可以的,第一个error后直接到catch了,谢谢!
13楼暂时解决了我的问题,谢谢大家的回复
返回的时候使用一个中间件,将不同类型的错误全部丢到这里,统一在这里处理。
示例:
@luoyjx 嗯,统一处理比较好
@William17
原来如此,这个是 => 比 , 优先级高…