我想发出一系列网络请求(在Qt中),其中一个请求的详细信息取决于最后一个请求的结果。目前我的代码如下所示:
QNetworkReply *reply = m->get(QNetworkRequest(QUrl("http://qt-project.org")));
reply->connect(reply,&QNetworkReply::finished,[=](){
//Do something with reply, calculate a value for the next request
QNetworkReply *reply2 = m->get(QNetworkRequest(QUrl("http://www.google.de")));
reply->deleteLater();
reply2->connect(reply2,&QNetworkReply::finished,[=](){
//Do something with reply2, calculate a value for the next request
QNetworkReply *reply3 = m->get(QNetworkRequest(QUrl("http://amazon.de")));
reply2->deleteLater();
reply3->connect(reply3,&QNetworkReply::finished,[=](){
//...
});
});
});
虽然这有效,但我发现有两个问题:
所以我正在寻找一种更好地构建此代码的方法。我想到了以下几个选项:
(1)使用阻塞请求,可以简单地写(伪代码!):
try {
ResultType res1 = blockingRequest("http://qt-project.org");
// Doe something with res1
ResultType res2 = blockingRequest("http://www.google.com");
// Doe something with res2
ResultType res3 = blockingRequest("http://amazon.de");
// Doe something with res3
catch(...) {
// ...
}
此代码必须在单独的线程中运行。我读到在Qt中很难做到阻塞请求,我宁愿坚持标准的Qt做事方式。
(2)使用宏或其他一些机制来编写更好看的代码。 我在考虑haskell中的“do”语法。我之前在Haxe用MonadSurprise完成了这个。在Haxe中使用它我可以写:
MonadSurprise.dO({
res1 <= request("http://qt-project.org");
res2 <= request("http://www.google.de");
res3 <= request("http://amazon.de");
});
MonadSurprise.dO是一个宏,负责正确处理Surprises(按请求返回)。它还通过停止完整操作并在发生错误时返回错误来处理错误处理。
但我不知道是否可以在c ++ / qt中完成这样的事情。