背景
我有一个函数,叫做
logInfoAsync
. 让我们考虑一下这个函数通过网络向日志服务器发送一些信息。为了解决这个问题,我们假设函数的实现如下:
const logInfoAsync = logger => message =>
new Promise( ( resolve, reject ) => {
setTimeout( () => {
//random fail reason.
if( message.length > 10 ){
reject( "We have angered the Gods. Message is too big!" );
return;
}
logger(message);
resolve();
}, 2000 );
})
用法:
const myLog= logInfoAsync( console.log );
myLog("Hello world!") // Rejected: "We have angered the Gods. Message is too big!"
myLog("Hello") // Resolved: "Hello"
问题
到现在为止,一直都还不错。我们有一个标准的记录器,有时工作,有时它激怒了神。
现在,假设我们有一个序列
async
计算:
const { Future } = require("Fluture");
const myLogF= Future.encaseP( logInfoAsync( console.log ) );
//request.get returns a Future and so does saveDB
request.get("http://mywebsite.com")
.chain( response => myLogF(`res is: ${res}`) )
.chain( saveDB )
.chain( ( ) => myLogF("Saved!") )
.fork(
err => console.log(`Something failed badly!: ${err}`),
( ) => console.log("Data saved to Olympus with great success!")
);
在这个例子中,如果伐木工人激怒了众神会发生什么?
好吧,我们没能保存数据!也许请求进行得很顺利,也许数据是有效的,但由于记录器失败,我们搞砸了!
研究
现在,一个可能的解决方案是
Fluture.bimap
在每一个日志之后。
这太可怕了
.
我不想让我的日志比现在更具攻击性,我也绝对不想让我的代码乱丢承诺式的东西
try/catch
S.
不幸的是,这是我唯一能想到的。。。我认为最好的选择是
备份记录器
,例如,
console.error
如果
myLogF
失败了,但我最理想的情况是我希望这是看不见的。
应用程序根本不应该知道它正在被记录!
问题
因此,根据这个片段,我有以下问题:
-
如果日志失败,您将如何保持链的运行?
-
如何使日志失败和恢复对应用程序不可见(而不将其与(
尝试/抓住
)?
-
日志最常用的模式是什么?