#include "api/DatasetLoadHandles.hpp" #include namespace geopro::data { namespace { QString reasonOf(const geopro::net::ApiResponse& r) { return r.msg.isEmpty() ? r.rawError : r.msg; } } // namespace ApiDetailLoad::ApiDetailLoad(geopro::net::ApiBatch* batch, Parser parse, QObject* parent) : DetailLoad(parent), batch_(batch), parse_(std::move(parse)) { QObject::connect(batch, &geopro::net::ApiBatch::succeeded, this, [this](const QList& resps) { if (aborted_) return; // §5.0 QVariant payload; try { payload = parse_(resps); // 仅解析在 try 内:下游 done 处理器抛出不应误报为解析失败 } catch (const std::exception& e) { emit failed(QString::fromUtf8(e.what())); deleteLater(); return; } catch (...) { // 非 std 异常跨信号槽会 terminate,兜底转 failed emit failed(QStringLiteral("解析失败:未知异常")); deleteLater(); return; } emit done(payload); deleteLater(); }); QObject::connect(batch, &geopro::net::ApiBatch::failed, this, [this](int, const geopro::net::ApiResponse& r) { if (aborted_) return; emit failed(reasonOf(r)); deleteLater(); }); } void ApiDetailLoad::abort() { if (aborted_) return; aborted_ = true; if (batch_) batch_->abort(); deleteLater(); } } // namespace geopro::data