Fix intermittent empty options expiry dropdown after coin select.

Retry instrument fetch, reject empty chains instead of caching them, and ignore stale loadChain races.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-07-16 12:04:08 +08:00
parent b50eebe37c
commit 12c4e55f24
4 changed files with 173 additions and 38 deletions
+21 -7
View File
@@ -353,13 +353,27 @@ def register_options_routes(app: Flask, cfg: dict[str, Any]) -> None:
if ex is None:
return jsonify({"ok": False, "msg": err})
u = (request.args.get("underlying") or cfg["default_underly"]).upper()
chain = cfg["build_option_chain"](
ex,
u,
max_dte_days=cfg["chain_max_dte_days"],
itm_only=False,
itm_max_dist_usd=cfg["itm_max_dist"],
)
try:
chain = cfg["build_option_chain"](
ex,
u,
max_dte_days=cfg["chain_max_dte_days"],
itm_only=False,
itm_max_dist_usd=cfg["itm_max_dist"],
)
except Exception as e:
return jsonify({"ok": False, "msg": f"加载期权链失败: {e}"})
expiries = chain.get("expiries") or []
chain_err = chain.get("chain_error")
if not expiries:
return jsonify(
{
"ok": False,
"msg": chain_err or "暂无到期日,请稍后点「刷新链」",
**chain,
"chain_max_dte_days": cfg["chain_max_dte_days"],
}
)
return jsonify({"ok": True, **chain, "chain_max_dte_days": cfg["chain_max_dte_days"]})
@app.route("/api/options/quote")
+1 -1
View File
@@ -273,4 +273,4 @@
</div>
</div>
<script src="/static/options_expiry_countdown.js?v=1"></script>
<script src="/static/options_panel.js?v=34"></script>
<script src="/static/options_panel.js?v=35"></script>