我有一个复杂的异步回调链,在链中的任何点上,如果出现错误,我想渲染带有错误消息的 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);
});
}
最佳答案
首先,我会看一下 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
真正基于此代码片段的解耦程度如何。
关于javascript - 在没有响应对象的情况下渲染 Jade View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23034965/