Node中的多个承诺,具有错误处理功能

时间:2014-07-01 21:11:23

标签: javascript node.js mongoose promise

如何在Node.js中使用一连串服务调用来避免嵌套地狱,我想在某些情况下抛出给定错误并退出整个链?以下是该链的一个例子:

  1. 加载Mongoose对象。
  2. 如果加载失败,res.send(404);如果加载成功,请转到下一个then()
  3. 致电第三方API以获取一些数据。
  4. 如果API调用失败,请发送正确的响应(假设正确的状态代码为500只是为了解决此问题)
  5. 如果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});
    });
    
  6. 我认为这是我想要实现的一个很好的例子,但是如果我们有更多的异步调用来处理呢?我们怎样才能立即退出链条?我已经做了一些搜索,我知道我还有很多东西需要学习,但我没有找到能够立即退出链条的能力。

1 个答案:

答案 0 :(得分:1)

当面对这个时,我通常会将所有内容分成函数,然后我将引用传递给promise。有了好名字,它也有益于阅读:

function resolveNotFoundIfGroupEmptyOrForwardResponse( response ) { res.send(404) }
function hit3rdPartyApiBasedOnResponse( response ) { 
// throw exception if there is an issue. next step will run the failure state
}    
function render500() { ... }
function renderTemplateWithData( some_data ) { 
   res.render('some.template', {data: some_data});
}

SomeMongooseModel.findOne({id:123}).exec()
    .then( resolveNotFoundIfGroupEmptyOrForwardResponse )
    .then( hit3rdPartyApiBasedOnResponse )
    .then( renderTemplateWithData, render500 )
    .done();

如果函数需要一个不是来自promise链的输入参数,那么我通常会做一个返回函数的函数。

function doStuffWithParamsCommingFromTwoSides( main_input ) {
   return function( promise_input ) {
         ...
   }
}

then( doStuffWithParamsCommingFromTwoSides( "foobar" ) )

遵循Promises / A +规范,then步骤如下所示:

promise.then(onFulfilled, onRejected, onProgress)

每当抛出异常时,下一步将运行onRejected。最终冒泡到done,也可以用来捕捉异常气泡。

promise.done(onFulfilled, onRejected, onProgress)