如何在Node.js中使用一连串服务调用来避免嵌套地狱,我想在某些情况下抛出给定错误并退出整个链?以下是该链的一个例子:
res.send(404)
;如果加载成功,请转到下一个then()
。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});
});
我认为这是我想要实现的一个很好的例子,但是如果我们有更多的异步调用来处理呢?我们怎样才能立即退出链条?我已经做了一些搜索,我知道我还有很多东西需要学习,但我没有找到能够立即退出链条的能力。
答案 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)