Hacktoberfest 2026: những issue maintainer đã đánh dấu cho tháng Mười, đang mở và phù hợp người mới. Xem issue Hacktoberfest

bug: CommandBar.runOnAsyncThread can hang forever when reading TNote bridge fields

Đang mở
#793 0 bình luận 0 reaction 1 người được giao Xem trên GitHub

@EduardMe đang làm issue này rồi.

Từ ngày 28/10/2026.

Đánh giá

Issue này chưa được đánh giá.

Mô tả

bug

Summary

CommandBar.runOnAsyncThread() (NotePlan 3.21.3+) can leave its Promise unresolved forever when the sync callback reads live NotePlan note objects (TNote / note.content / note.paragraphs / frontmatter) via the plugin bridge. Plugin code that awaits the result never resumes, so finally cleanup (e.g. CommandBar.showLoading(false)) never runs and UI progress dialogs stay stuck.

We have now hit this twice in np.Shared cache rebuilds.

Observed behaviour

1. Tag / mention cache (Dashboard install rebuild)

User vault ~1667 calendar + ~4844 regular notes. Dashboard onUpdateOrInstall forced a tag/mention cache rebuild, which scans notes inside runOnAsyncThread via our helper runSyncWorkOnAsyncThread.

Log sequence:

generateTagMentionCache :: - processing 1667 calendar + 4844 regular notes ...
generateTagMentionCache :: - scanning 1667 calendar notes ...
runSyncWorkOnAsyncThread :: generateTagMentionCache calendar: starting on async thread

Then nothing: no async thread finished, no completion / error path, no showLoading(false).

Progress UI (CommandBar.showLoading) updated every 100 notes and stuck at:

Generating tag/mention cache: reading calendar note 1600/1667

(That count only means note 1600 was reached; the next UI tick would be 1700. Hang is somewhere after that progress update -- later notes and/or returning from the async callback.)

Meanwhile the main plugin thread kept accepting other Dashboard work (windowReload, showDashboardReact, section refreshes), which is consistent with the background job never completing while onUpdateOrInstall stayed parked on await generateTagMentionCache(...).

2. Notes-changed-recently cache (earlier, same API)

Reading a few TNote fields inside runOnAsyncThread during generate/update left Projects Refresh spinning indefinitely. We worked around it in np.Shared 1.3.1 by keeping that cache on the main thread, with comments documenting that bridge field reads inside the async API hung the Promise live.

What we already ruled out / worked around on the plugin side

  • Returning large objects from the async callback previously also hung the Promise (scan finished, await never resumed). Tag/mention cache now only returns a primitive (true) and stores results in outer variables. That did not prevent this hang.
  • CommandBar.showLoading from inside the callback is documented as allowed and did update for a long time before the hang.
  • This does not look like a simple "vault too big / slow" case: progress advanced through ~1600 notes, then the Promise never settled.

Ask

Please confirm whether reading live note bridge objects from CommandBar.runOnAsyncThread is unsupported, or whether this is a platform bug.

If unsupported, docs should say so explicitly (safe work = plain data only; gather TNote fields on the main thread first).

If supported, we need the Promise to always settle (resolve or reject) even when note-field reads fail or deadlock, so plugins can clear loading UI and recover.

Workaround plugins are using

Until this is reliable, Shared Resources will avoid runOnAsyncThread for loops that read live TNote fields (main-thread scan + showLoading progress), same as the notes-changed-recently cache.

Environment

  • API: CommandBar.runOnAsyncThread (feature gated from 3.21.3)
  • Plugins: np.Shared tag/mention cache + Dashboard onUpdateOrInstall forced rebuild
  • Repro scale: ~6.5k notes in the reported vault
Ngôn ngữ chính
JavaScript
Star
203
Fork
81
Merge trung bình
52 phút
Pull request đã merge (30 ngày)
1

Chuẩn bị môi trường

Dự án này không cung cấp dev container, Dockerfile hay hướng dẫn đóng góp, nên bạn cần tự thiết lập môi trường: hãy bắt đầu từ README và xem hướng dẫn đóng góp lần đầu của chúng tôi để biết các bước chung.

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Issue khác của NotePlan/plugins

Tất cả issue của NotePlan/plugins

Issue tương tự

Thêm issue về JavaScript

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.