#include "api/NavRequest.hpp" #include namespace geopro::data { namespace { QString reasonOf(const geopro::net::ApiResponse& r) { return r.msg.isEmpty() ? r.rawError : r.msg; } } // namespace ApiNavRequest::ApiNavRequest(geopro::net::IApiCall* call, Parser parse, Predicate isFailure, QObject* parent) : NavRequest(parent), call_(call), parse_(std::move(parse)), isFailure_(std::move(isFailure)) { QObject::connect(call, &geopro::net::IApiCall::finished, this, [this](const geopro::net::ApiResponse& resp) { if (aborted_) return; // §5.0 入口守卫 if (isFailure_(resp)) { emit failed(reasonOf(resp)); deleteLater(); return; } QVariant out; try { out = parse_(resp); // 仅解析在 try 内(下游 done 处理器抛出不误报) } catch (const std::exception& e) { emit failed(QString::fromUtf8(e.what())); deleteLater(); return; } catch (...) { emit failed(QStringLiteral("解析失败:未知异常")); deleteLater(); return; } emit done(out); deleteLater(); }); } void ApiNavRequest::abort() { if (aborted_) return; aborted_ = true; if (call_) call_->abort(); deleteLater(); } } // namespace geopro::data