回调地狱
/// Set connection callback.
/// Not thread safe.
void setConnectionCallback(ConnectionCallback cb)
{ connectionCallback_ = std::move(cb); }
/// Set message callback.
/// Not thread safe.
void setMessageCallback(MessageCallback cb)
{ messageCallback_ = std::move(cb); }
/// Set write complete callback.
/// Not thread safe.
void setWriteCompleteCallback(WriteCompleteCallback cb)
{ writeCompleteCallback_ = std::move(cb); }
Callback Hell是指在回调函数中继续回调其他的函数接口,其他函数接口递归回调
嵌套回调的缺点
- 代码耦合,一旦修改,原地爆炸。
- 无法排错,也是原地爆炸。无法保存调用上下文,比较难debug
解决方案Future
Future<ReturnCode> handleRequest(Request req)
{
return req.ReadBody().Then([req](Buffer &&buf){
return req.WriteResponse(buf)l
}).Finally([req](){
req.CleanUp();
return MakeReadyFuture<ReturnCode>(OK);
})
}
- Future/Promise提供了基础异步机制
- 通过返回Future后续回调函数通过Then挂载,使整个应用逻辑串联起来
- 任何情况下Finally都会被调用处理未经捕捉的异常和资源清理
- Continuation-Passing Style将后续逻辑作为Then的参数传递(Continuation)