[2.0 / next] An <Errored> recovering after a retry waits for async under a nested <Loading>
Maintainer thường phản hồi trong vòng 1 ngày
Chưa có ai nhận issue này.
Đánh giá
- Độ khó
- 4/5
- Thời gian dự kiến
- 1-2 ngày
- Mức phù hợp với người mới
- 52/100
- Loại issue
- Lỗi
- Độ rõ ràng
- Đặc tả rõ ràng
- Mức độ hoạt động
- Sôi nổi
- Công nghệ
- javascript, typescript
Hướng nghiên cứu
The report names a reproduction test under packages/web/test but no existing test file or implementation entry point. Start by locating the Errored recovery logic and related tests, then add the supplied nested Loading reproduction and run it. Done means recovered content shows immediately after the detail request succeeds, while the nested fallback remains until search results arrive.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
Found by: the ReactiveScript eval, at next 5e68925c (rc.20). The .rx and Solid TSX apps of one eval task now fail "retry after not found shows the issue". The same apps passed at 6b792a95. The likely cause is the Errored recovery change in #4406 (#4403 to #4405), but I haven't bisected.
Program
detail: an async memo that throws when the answer isnull.- The view:
<Loading>›<Errored>›<h2>{detail().title}</h2>, plus a child component that searches by the title, with its own<Loading>around the hits.
Steps
detailanswersnull, so the fallback shows.refresh(detail).detailanswers{ title: "Crash" }.- The nested search answers.
Text after each step
| step | nested search | no nested search |
|---|---|---|
| not found | err not found |
err not found |
| retry | err not found |
err not found |
| retry landed | err not found |
Crash |
| search landed | Crashab |
— |
Expected at "retry landed": Crashfinding. The recovered content shows, and the nested <Loading> shows its own fallback until the search answers. That nested boundary exists so its content doesn't hold the rest. Instead, the Errored keeps showing the old failure until the nested async lands. If that async is slow or never answers, the retry looks like it did nothing.
Test (packages/web/test)
/**
* @jsxImportSource @solidjs/web
* @vitest-environment jsdom
*/
import { test } from "vitest";
import { Errored, For, Loading, Show, createMemo, flush, refresh } from "solid-js";
import { render } from "../src/index.js";
const tick = async () => { for (let i = 0; i < 4; i++) { await new Promise(r => setTimeout(r, 0)); flush(); } };
for (const nested of [true, false])
test(`nested=${nested}`, async () => {
const asks: { key: string; res: (v: any) => void }[] = [];
const ask = (key: string) => new Promise<any>(res => asks.push({ key, res }));
const land = async (key: string, v: any) => { const i = asks.findIndex(a => a.key === key); if (i < 0) throw new Error(`not asked ${key}: ${asks.map(a => a.key)}`); asks.splice(i, 1)[0].res(v); await tick(); };
const container = document.body.appendChild(document.createElement("div"));
const frames: string[] = [];
const snap = (tag: string) => frames.push(`${tag.padEnd(14)} ${container.textContent}`);
let detail!: () => any;
function Related(props: { title: string }) {
const hits = createMemo(() => ask(`search:${props.title}`));
return <Loading fallback={<i>finding</i>}><For each={hits()}>{(h: any) => <i>{h}</i>}</For></Loading>;
}
render(() => {
detail = createMemo(async () => { const d = await ask("detail"); if (!d) throw new Error("not found"); return d; });
return (
<Loading fallback={<p>loading</p>}>
<Errored fallback={(e: any) => <p>err {e().message}</p>}>
<h2>{detail().title}</h2>
{nested && <Show when={detail()}>{(d: any) => <Related title={d().title} />}</Show>}
</Errored>
</Loading>
);
}, container);
await tick();
await land("detail", null); snap("not found");
refresh(detail); flush(); await tick(); snap("retry");
await land("detail", { title: "Crash" }); snap("retry landed");
if (nested) { await land("search:Crash", ["a", "b"]); snap("search landed"); }
console.log(`nested=${nested}\n ` + frames.join("\n "));
container.remove();
});
- Ngôn ngữ chính
- TypeScript
- Star
- 36.2k
- Fork
- 1.1k
- Merge trung bình
- 11 giờ 5 phút
- Pull request đã merge (30 ngày)
- 475
Chuẩn bị môi trường
- Không có Dockerfile hay tệp Docker Compose
- Có mẫu pull request
- Đọc hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- 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.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của solidjs/solid
-
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 28/100
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 12/100
Maintainer thường phản hồi trong vòng 1 ngày
-
[2.0 / next] <Errored> recovery shows a pending memo's answer to an older input beside the new inputĐang mở
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 20/100
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 5/5 Hơn một tuần Mức phù hợp với người mới 15/100
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 5/5 Hơn một tuần Mức phù hợp với người mới 18/100
Maintainer thường phản hồi trong vòng 1 ngày
Tất cả issue của solidjs/solid
Issue tương tự
-
triage
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 82/100
Maintainer thường phản hồi trong vòng 1 ngày
-
🎙️ task - drop the raw `./node_modules/.bin/rhachet roles boot` line from bhuild's feedback templateĐang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 62/100
ehmpathy/rhachet-roles-bhuild#639 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
e2e-failure ready-to-code
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 70/100
redhat-developer/rhdh-plugin-export-overlays#4650 · 1 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 62/100
Maintainer thường phản hồi trong vòng 13 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 75/100
omdsh-dev/DSH-better-sidebar#1098 ·
Maintainer thường phản hồi trong vòng 2 ngày