React Academy · บทเรียน

ตรรกะแบบอะซิงก์ด้วย createAsyncThunk

จัดการการเรียก API ใน Redux ด้วย createAsyncThunk และวงจรชีวิต pending/fulfilled/rejected

บทเรียน 2 จาก 413 ขั้นตอน

ตรรกะแบบอะซิงก์ด้วย createAsyncThunk เป็นบทเรียน React Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน React Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส React Academy มีบทเรียนทั้งหมด 4 บทเรียน

ยินดีต้อนรับ

ในบทเรียนนี้ คุณจะจัดการการเรียก API ใน Redux ด้วย createAsyncThunk และจัดการแอ็กชันตามวงจรชีวิต ได้แก่ pending, fulfilled และ rejected ภายใน slice ของคุณ

createAsyncThunk คืออะไร

createAsyncThunk สร้างตัวสร้างแอ็กชัน thunk ที่ส่งแอ็กชันตามวงจรชีวิตสามรายการโดยอัตโนมัติ ได้แก่ pending (เริ่มทำงาน), fulfilled (เสร็จสมบูรณ์) และ rejected (ล้มเหลว) คุณจะจัดการแต่ละรายการใน extraReducers

การกำหนด Thunk

เรียก createAsyncThunk ด้วยสตริงชนิดข้อมูลและฟังก์ชันสร้าง payload แบบอะซิงโครนัส ให้ส่งคืนข้อมูลที่คุณต้องการใช้เป็น payload ของ fulfilled
import { createAsyncThunk } from '@reduxjs/toolkit';

export const fetchUser = createAsyncThunk(
  'users/fetchById',
  async (userId) => {
    const response = await fetch('/api/users/' + userId);
    return response.json(); // becomes action.payload on fulfilled
  }
);

การจัดการใน extraReducers

เพิ่มกรณีสำหรับสถานะตามวงจรชีวิตทั้งสามรายการใน extraReducers ของ slice จัดการสถานะการโหลด ข้อมูล และข้อผิดพลาดให้สอดคล้องกัน
extraReducers: (builder) => {
  builder
    .addCase(fetchUser.pending, state => {
      state.loading = true;
      state.error = null;
    })
    .addCase(fetchUser.fulfilled, (state, action) => {
      state.loading = false;
      state.user = action.payload;
    })
    .addCase(fetchUser.rejected, (state, action) => {
      state.loading = false;
      state.error = action.error.message;
    });
}

การส่ง Thunk

ส่ง thunk จากคอมโพเนนต์ด้วย useDispatch ส่งอาร์กิวเมนต์ไปยังตัวสร้างแอ็กชัน thunk โดยตรง
const dispatch = useDispatch();
useEffect(() => {
  dispatch(fetchUser(userId));
}, [userId]);

การเข้าถึงสถานะใน Thunk

ฟังก์ชันสร้าง payload จะได้รับออบเจ็กต์ thunkAPI เป็นอาร์กิวเมนต์ตัวที่สอง ใช้ thunkAPI.getState() เพื่ออ่านสถานะ Redux ปัจจุบัน และใช้ thunkAPI.dispatch() เพื่อส่งแอ็กชันอื่น
export const saveItem = createAsyncThunk(
  'items/save',
  async (item, { getState }) => {
    const { auth } = getState();
    return fetch('/api/items', {
      method: 'POST',
      headers: { Authorization: 'Bearer ' + auth.token },
      body: JSON.stringify(item),
    }).then(r => r.json());
  }
);

การจัดการข้อผิดพลาดด้วย rejectWithValue

หากต้องการส่ง payload ข้อผิดพลาดแบบกำหนดเองไปยังกรณี rejected ให้ใช้ thunkAPI.rejectWithValue() โดย action.payload ของแอ็กชัน rejected จะมีออบเจ็กต์ข้อผิดพลาดแบบกำหนดเองของคุณอยู่
export const fetchData = createAsyncThunk(
  'data/fetch',
  async (id, { rejectWithValue }) => {
    const res = await fetch('/api/' + id);
    if (!res.ok) return rejectWithValue({ status: res.status });
    return res.json();
  }
);
// In rejected case: action.payload.status is available

การยกเลิก Thunk

ส่งสัญญาณ AbortController ไปยัง fetch ภายใน thunk ของคุณ โดย createAsyncThunk จะจัดเตรียมสัญญาณผ่าน thunkAPI.signal ให้อัตโนมัติ เมื่อ thunk ถูกยกเลิกด้วย dispatch.abort()
async (id, { signal }) => {
  const res = await fetch('/api/' + id, { signal });
  return res.json();
}

การรอ Thunk ที่ส่งไป

dispatch() ของ thunk จะส่งคืน Promise คุณสามารถใช้ await เพื่อทราบว่างานแบบอะซิงโครนัสเสร็จสิ้นเมื่อใด ซึ่งมีประโยชน์สำหรับรูปแบบการเปลี่ยนเส้นทางหลังการบันทึก
const result = await dispatch(saveItem(data));
if (saveItem.fulfilled.match(result)) {
  navigate('/success');
}

รูปแบบ Builder เทียบกับรูปแบบออบเจ็กต์

ใช้รูปแบบ callback builder.addCase ใน extraReducers เพราะปลอดภัยด้านชนิดข้อมูลและยังรองรับอยู่ ส่วนรูปแบบการใช้คีย์ของออบเจ็กต์แบบเก่าถูกเลิกใช้แล้วใน RTK รุ่นล่าสุด

ตรวจสอบด่วน

จะเกิดอะไรขึ้นเมื่อฟังก์ชันแบบอะซิงโครนัสภายใน createAsyncThunk โยนข้อผิดพลาด

สรุปทบทวน

createAsyncThunk สร้างแอ็กชัน pending/fulfilled/rejected โดยอัตโนมัติ ให้จัดการทั้งสามรายการใน extraReducers ใช้ rejectWithValue สำหรับ payload ข้อผิดพลาดแบบกำหนดเอง และใช้ thunkAPI.getState() เพื่อเข้าถึงสถานะปัจจุบันภายใน thunk

ขั้นถัดไป

บทเรียนถัดไป: **RTK Query: จุดปลายทางและการแคชอัตโนมัติ** — คุณจะกำหนดจุดปลายทางของ API ด้วย createApi และให้ RTK Query จัดการการแคชโดยอัตโนมัติ
เริ่มต้นได้ฟรี

เรียนรู้ React ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
88
บทเรียน
324

คำถามที่พบบ่อย

บทเรียน “ตรรกะแบบอะซิงก์ด้วย createAsyncThunk” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “ตรรกะแบบอะซิงก์ด้วย createAsyncThunk” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส React Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส React Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “ตรรกะแบบอะซิงก์ด้วย createAsyncThunk”

จัดการการเรียก API ใน Redux ด้วย createAsyncThunk และวงจรชีวิต pending/fulfilled/rejected คุณปฏิบัติ React Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน React Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน React Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “ตรรกะแบบอะซิงก์ด้วย createAsyncThunk” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน React Academy นี้ได้ไหม

ได้ บทเรียน React Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. สไลซ์ Redux Toolkit และ createSlice
  2. ตรรกะแบบอะซิงก์ด้วย createAsyncThunk
  3. RTK Query: เอนด์พอยต์และการแคชอัตโนมัติ
  4. การอัปเดตเชิงคาดการณ์และการทำให้แคชเป็นโมฆะ
← กลับไปที่ React Academy