请问bluebird怎么中断promise的执行
发布于 1 个月前 作者 wtwei 371 次浏览 来自 问答

QQ图片20160328175928.png 当第一个请求执行到error的时候中断后面的then执行

19 回复

同上,这两天写这个也遇到这个问题了

untitled1.png 一个被 reject 的 promise, 后续的 then queue 都不会执行。。。

也就是说, 你的代码中执行了 reject handler, 其他的 fulfill handler 都不会执行。

untitled1.png

1 跟 2只会执行一个,然后如果执行的是 2, 那么3也不会执行

express的话可以用这个 https://cnodejs.org/topic/56f6260487688ffc6e356e7c generator的错误处理还是比较直观的, 用 try catch 将 yield 操作包住即可。

@magicdawn 现在走到2后直接就执行3了

@wtwei

sorry, 确实是这样,我之前理解有误 untitled1.png 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再次抛出既可,验证 untitled2.png

对应的,你需要 untitled3.png

我只想说 generator / co 大法好。。。

@William17 帮看下这个

untitled1.png

貌似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(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

原来如此,这个是 => 比 , 优先级高…

回到顶部