如何使用boost::beast避免回调地狱?

如何使用boost::beast避免回调地狱?,boost,boost-asio,boost-beast,beast-websockets,Boost,Boost Asio,Boost Beast,Beast Websockets,我正在开发一个应用程序,我想在其中使用boost::beast/asio。我需要通过websocket连接接收数据,同时向RESTAPI发出请求 在boost::beast websocket/HTTP异步客户端示例中,下一个异步操作似乎是在完成处理程序中启动的。这似乎产生了与我在node.js应用程序中看到的相同的“回调地狱” 为了避免这种情况,我考虑在我的应用程序中使用一个简单的状态机来决定下一步要启动什么操作。我正在考虑在应用程序中使用while循环,在io_上下文中调用poll(),然后

我正在开发一个应用程序,我想在其中使用boost::beast/asio。我需要通过websocket连接接收数据,同时向RESTAPI发出请求

在boost::beast websocket/HTTP异步客户端示例中,下一个异步操作似乎是在完成处理程序中启动的。这似乎产生了与我在node.js应用程序中看到的相同的“回调地狱”

为了避免这种情况,我考虑在我的应用程序中使用一个简单的状态机来决定下一步要启动什么操作。我正在考虑在应用程序中使用while循环,在io_上下文中调用poll(),然后运行状态机代码(例如switch(state){…state=nextState;})

然而,这可能会创建一个繁忙的循环,其中主线程在持续运行状态机的同时消耗100%的cpu


我的推理正确吗?使用post()之类的东西将一个可以推进状态机的函子排队会更好吗

我希望我能把这作为一个评论,因为这不是一个完整的答案,但我没有足够的声誉来评论

如果您正在谈论node.js,我假设您对“承诺”和/或更新的“异步/等待”有一定的经验-至少node.js可以避免回调地狱

事实证明Boost Asio与node.js“async/await”类似。它被称为Boost-Asio-Coroutines,您实现它的方式与node.js“async/await”完全相同


不确定运行消耗100%线程的while循环是否是个好主意?如果有更好的解决方案,那就有点浪费了。

谢谢你的回复。我讨厌整个node.js方法中的承诺和异步等待。这太令人困惑了,我看不到自己用它构建任何像样大小的应用程序。状态机的优点是将逻辑集中在一个地方,这比将其分散在无数的回调中要好得多。我知道承诺可以被束缚,但对我来说,它解决不了任何问题。我不熟悉javascript,但我确实喜欢boost::asio中的协同程序。它们的行为非常类似于阻塞线程上的IO,但开销要小得多。在执行调用时,您的函数只是挂起,直到返回结果为止,您不必提供回调。