我的具体示例是针对Node.js,但我认为在任何基于事件循环的系统中都存在同样的问题。
考虑以下简单应用:
var logger = loggingmodule.Logger();
var server = http.createServer(function(req, res) {
req.id = crypto.pseudoRandomBytes(10).toString('hex');
var log = logger.transaction(req.id);
loadSomeAsyncData(log, function(err, data) {
if (err) return bailout(err, req, res);
doSomeAsyncAction(log, req.url, data.action, function(err, result) {
if (err) return bailout(err, req, res);
hydrateResultWithMoreAsyncData(log, data, result, onMoreData);
function onMoreData(err, moreData) {
if (err) return bailout(err, req, res);
result.data = moreData;
res.end(JSON.stringify({
data: data,
result: result,
}));
}
});
});
});
transaction
方法,该方法返回一个上下文记录器,该记录器为所有行添加相同的标记问题:是否有将记录器传递给每个功能的替代方法?
我能想到的最接近的东西就是线程局部绑定 - 当然,对于Node.js来说,没有这样的抽象或afaik存在