【发布时间】:2014-08-22 13:09:00
【问题描述】:
如何避免 Node.js 中的服务调用链嵌套地狱,我想在某些情况下抛出给定错误并退出整个链?下面是链的一个例子:
- 加载 Mongoose 对象。
- 如果加载失败,
res.send(404);如果加载成功,转到下一个then()。 - 调用第 3 方 API 以获取一些数据。
- 如果 API 调用失败,发送正确的响应(假设正确的状态码是
500只是为了解决这个问题) -
如果 API 调用成功,则渲染页面。
SomeMongooseModel.findOne({id:123}).exec() .then(function(response) { // If group is empty, would like to res.send(404) and resolve the // promise immediately. }) .then(function(response) { // Hit 3rd party API to retrieve data. If there's an issue, return // response code of 500 and resolve promise immediately. // Assuming the API call was a success, build out an object and render // the page like so: res.render('some.template', {data: some_data}); });
我认为这是我正在努力实现的一个很好的例子,但是如果我们有更多的异步调用需要处理呢?我们如何才能立即退出链条?我做了一些搜索,我知道我还有很多东西要学,但我没有找到立即退出链条的能力。
【问题讨论】:
-
我应该补充一点,我尝试过使用
.catch()...,但收到Object #<Promise> has no method 'catch'的错误 - 似乎这是只有某些对象提供的糖,而不是承诺规范的必要条件? -
调用 promise 提供的 reject() 方法应该会取消后续的链式调用。
-
@dandavis:promise 对象不应该有
.reject方法。还是这是一些不起眼的自制 promise 库? -
@Bergi:reject 是 Promise 构造函数的第二个参数,它如何提供给实例是特定于实现的。
标签: javascript node.js mongoose promise