我有一个复杂的异步回调链,在链中的任何一点,如果出现错误,我想用错误信息渲染一个Jade模板。
在下面的函数partnerErr中,是否可以使用没有原始响应对象的模板进行响应?
app.post('/dashboard/partners/create', function (req, res) {
console.log( req.body );
ParseUtils.doesUserExist(
req.body.partnerEmail,
function() { ShopifyUtils.doesPartnerExist( req.body.partnerShopSlug,
function() { ParseUtils.createUser( req.body,
function() { ShopifyUtils.createPartner( req.body,
res.send( ' all good. parse and shopify passed. user created. '),
partnerErr
); },
partnerErr
); },
partnerErr
);
},
partnerErr
);
});
function partnerErr(err) {
console.log( 'rendering partner error' );
app.render('admin/partnersCreate', { error : err }, function(err, html) {
console.log('html', html);
});
}
答案 0 :(得分:1)
首先,我会看一下https://github.com/caolan/async来清理你的一系列异步调用。许多嵌套几乎是不可读的。看起来series
或waterfall
符合您的需求。这也将大大减少您需要编写partnerErr
并将所有错误检查逻辑移动到一个位置的次数。
话虽如此,为什么不将res
传递给partnerErr
并使用res.render
?我能正确理解你的问题吗?
<强>更新强>
我强烈建议您按照我上面的说法考虑改写,但是,如果你想不管它,你可以这样做:
app.post('/dashboard/partners/create', function(req, res) {
console.log(req.body);
ParseUtils.doesUserExist(
req.body.partnerEmail,
function() {
ShopifyUtils.doesPartnerExist(req.body.partnerShopSlug,
function() {
ParseUtils.createUser(req.body,
function() {
ShopifyUtils.createPartner(req.body,
res.send(' all good. parse and shopify passed. user created. '),
partnerErr(res)
);
},
partnerErr(res)
);
},
partnerErr(res)
);
},
partnerErr(res)
);
});
function partnerErr(res) {
return function(err) {
console.log('rendering partner error');
res.render('admin/partnersCreate', {
error: err
});
}
}
另一种选择是将partnerErr
函数移动到与app.post
相同的范围内,并且只能访问res
变量。我不确定partnerErr
真正基于这个片段的解耦方式。