我正在使用boost :: future .then()功能。我写了一个小型反应器,它以异步方式读取文件。有一个函数readFileAsync(int fd),它返回文件中数据的未来。当描述符准备好并履行承诺时,该反应器将读取固定数量的字节。但是,如果文件中有更多数据,我会决定如何重新启动未来。这样做的模式是什么?
readFileAsync(fd).then([&](auto future) {
auto data = future.get();
if (data.block.empty()) { // end of file
close(data.fd);
} else {
readFileAsync(data.fd).then(...); // XXX: how to work that out?
}
});
答案 0 :(得分:1)
而不是匿名lambda,创建正常的循环函数:
struct continue_reading
{
template <typename T>
void operator()(T future)
{
auto data = future.get();
if (data.block.empty()) { // end of file
close(data.fd);
} else {
readFileAsync(data.fd).then(continue_reading);
}
};
//...
readFileAsync(fd).then(continue_reading)