Đây là bài đăng đầu tiên trong sê-ri, giải thích cách tạo bộ lập lịch mã javascript đơn giản. Bộ lập lịch biểu là công cụ bắt buộc để lấy dữ liệu định kỳ từ API. Một cái gì đó cần phải kiểm soát tại thời điểm các yêu cầu sẽ được thực hiện. Mục đích của loạt bài này là để chứng minh rằng nó có thể được thực hiện trong một vài dòng Javascript đơn giản
Để ngắn gọn, bài đăng này chỉ đề cập đến chức năng tạm dừng đơn giản
const pause = time => new Promise[resolve => setTimeout[resolve, time]]
Vào chế độ toàn màn hình Thoát chế độ toàn màn hình
chức năng tạm dừng trả về một Lời hứa khi được gọi. Lời hứa tự giải quyết sau một khoảng thời gian nhất định, cho chúng tôi khả năng xâu chuỗi một số đoạn mã và trì hoãn nó. Sắp xếp một cơ chế kiểm soát luồng để thực thi mã
Nếu chúng ta tưởng tượng việc triển khai hàm fetchData đang hoạt động, chúng ta có thể trì hoãn nó trong 2 giây như vậy
pause[2000].then[fetchData]
Vào chế độ toàn màn hình Thoát chế độ toàn màn hình
Hoặc sử dụng nó bên trong chức năng không đồng bộ để tạm dừng thực thi giữa hai dòng trong 1 giây
async function fetchAllData[] {
const data1 = await fetchData1[...]
await pause[1000]
const data2 = await fetchData2[...]
return {...data1, ...data2}
}
Vào chế độ toàn màn hình Thoát chế độ toàn màn hình
Một lớp lót khá mạnh mẽ và điều đó thậm chí không bao gồm tất cả các khả năng. Trong các bài đăng sau, chúng tôi sẽ xây dựng ý tưởng tạm dừng này và biến nó thành một phần quan trọng trong lịch biểu của chúng tôi
Trong JavaScript, IO [ví dụ: Filesystem IO, Network IO] không đồng bộ. Điều đó có nghĩa là khi bạn đang gọi một hàm liên quan đến IO, bạn phải có một hàm gọi lại được chuyển vào để được thông báo khi IO hoàn thành
function getWeddingDetail[itemId, callback] {
// call IO
window.fetch[`//api.com/wedding/${itemId}`, function callback[
error,
wedding
] {
// get notified when the result is back
if [error] {
handleError[error];
} else {
callback[wedding];
}
}];
}
Lúc đầu, nó có vẻ vô tội, nhưng một khi chúng tôi bắt đầu xâu chuỗi nhiều cuộc gọi không đồng bộ, chúng tôi sẽ rơi vào một tình huống được gọi là địa ngục gọi lại, mà không nghi ngờ gì nữa, là một thứ thực sự không hay để làm việc với
function getProfile[userId, callback] {
return window.fetch[`//api.com/user/${userId}`, callback];
}
function getWeddingDetail[itemId, callback] {
// call IO
window.fetch[`//api.com/wedding/${itemId}`, function callback[
error,
wedding
] {
// get notified when the result is back
if [error] {
handleError[error];
} else {
getProfile[wedding.groomId, function[groomError, groom] {
if [groomError] {
handleError[groomError];
} else {
getProfile[wedding.brideId, function[brideError, bride] {
if [brideError] {
handleError[brideError];
} else {
callback[{ wedding, bride, groom }];
}
}];
}
}];
}
}];
}
Vì vậy, chúng tôi đã nghĩ ra Promise và
function getProfile[userId, callback] {
return window.fetch[`//api.com/user/${userId}`, callback];
}
function getWeddingDetail[itemId, callback] {
// call IO
window.fetch[`//api.com/wedding/${itemId}`, function callback[
error,
wedding
] {
// get notified when the result is back
if [error] {
handleError[error];
} else {
getProfile[wedding.groomId, function[groomError, groom] {
if [groomError] {
handleError[groomError];
} else {
getProfile[wedding.brideId, function[brideError, bride] {
if [brideError] {
handleError[brideError];
} else {
callback[{ wedding, bride, groom }];
}
}];
}
}];
}
}];
}
4, để làm cho cuộc sống dễ dàng hơnfunction getProfile[userId, callback] {
return window.fetch[`//api.com/user/${userId}`, callback];
}
function getWeddingDetail[itemId, callback] {
// call IO
window.fetch[`//api.com/wedding/${itemId}`, function callback[
error,
wedding
] {
// get notified when the result is back
if [error] {
handleError[error];
} else {
getProfile[wedding.groomId, function[groomError, groom] {
if [groomError] {
handleError[groomError];
} else {
getProfile[wedding.brideId, function[brideError, bride] {
if [brideError] {
handleError[brideError];
} else {
callback[{ wedding, bride, groom }];
}
}];
}
}];
}
}];
}
4 cho phép chúng tôi viết mã không đồng bộ giống như mã đồng bộ, sử dụng function getProfile[userId, callback] {
return window.fetch[`//api.com/user/${userId}`, callback];
}
function getWeddingDetail[itemId, callback] {
// call IO
window.fetch[`//api.com/wedding/${itemId}`, function callback[
error,
wedding
] {
// get notified when the result is back
if [error] {
handleError[error];
} else {
getProfile[wedding.groomId, function[groomError, groom] {
if [groomError] {
handleError[groomError];
} else {
getProfile[wedding.brideId, function[brideError, bride] {
if [brideError] {
handleError[brideError];
} else {
callback[{ wedding, bride, groom }];
}
}];
}
}];
}
}];
}
6, bạn có thể tạm dừng chức năng, đợi IO và tiếp tục thực thi________số 8
Hơn nữa, bạn có thể bắt tất cả các lỗi cùng một lúc, thật kỳ diệu phải không?
Mỗi chức năng có một màu
Tuy nhiên,
function getProfile[userId, callback] {
return window.fetch[`//api.com/user/${userId}`, callback];
}
function getWeddingDetail[itemId, callback] {
// call IO
window.fetch[`//api.com/wedding/${itemId}`, function callback[
error,
wedding
] {
// get notified when the result is back
if [error] {
handleError[error];
} else {
getProfile[wedding.groomId, function[groomError, groom] {
if [groomError] {
handleError[groomError];
} else {
getProfile[wedding.brideId, function[brideError, bride] {
if [brideError] {
handleError[brideError];
} else {
callback[{ wedding, bride, groom }];
}
}];
}
}];
}
}];
}
4 vẫn tồn tại trong thời gian ngắn. Mọi thứ trở nên tồi tệ khi bạn quên sử dụng function getProfile[userId, callback] {
return window.fetch[`//api.com/user/${userId}`, callback];
}
function getWeddingDetail[itemId, callback] {
// call IO
window.fetch[`//api.com/wedding/${itemId}`, function callback[
error,
wedding
] {
// get notified when the result is back
if [error] {
handleError[error];
} else {
getProfile[wedding.groomId, function[groomError, groom] {
if [groomError] {
handleError[groomError];
} else {
getProfile[wedding.brideId, function[brideError, bride] {
if [brideError] {
handleError[brideError];
} else {
callback[{ wedding, bride, groom }];
}
}];
}
}];
}
}];
}
6Điều này có thể xảy ra nếu bạn không biết chi tiết triển khai của
function getProfile[userId, callback] {
return window.fetch[`//api.com/user/${userId}`, callback];
}
function getWeddingDetail[itemId, callback] {
// call IO
window.fetch[`//api.com/wedding/${itemId}`, function callback[
error,
wedding
] {
// get notified when the result is back
if [error] {
handleError[error];
} else {
getProfile[wedding.groomId, function[groomError, groom] {
if [groomError] {
handleError[groomError];
} else {
getProfile[wedding.brideId, function[brideError, bride] {
if [brideError] {
handleError[brideError];
} else {
callback[{ wedding, bride, groom }];
}
}];
}
}];
}
}];
}
9 trong đó function getProfile[userId, callback] {
return window.fetch[`//api.com/user/${userId}`, callback];
}
function getWeddingDetail[itemId, callback] {
// call IO
window.fetch[`//api.com/wedding/${itemId}`, function callback[
error,
wedding
] {
// get notified when the result is back
if [error] {
handleError[error];
} else {
getProfile[wedding.groomId, function[groomError, groom] {
if [groomError] {
handleError[groomError];
} else {
getProfile[wedding.brideId, function[brideError, bride] {
if [brideError] {
handleError[brideError];
} else {
callback[{ wedding, bride, groom }];
}
}];
}
}];
}
}];
}
9 không đồng bộ, vì nó thực hiện cuộc gọi IO không đồng bộĐiều này dẫn đến một vấn đề khác, đó là mọi chức năng đều có một màu. Ngay khi bạn thực hiện lệnh gọi không đồng bộ trong một hàm, bạn phải làm cho chính hàm đó không đồng bộ và trình gọi hàm này cũng không đồng bộ và trình gọi của nó cũng vậy,
Vì vậy, có cách nào khác để tạm dừng một chức năng JavaScript mà không cần phải
function getProfile[userId, callback] {
return window.fetch[`//api.com/user/${userId}`, callback];
}
function getWeddingDetail[itemId, callback] {
// call IO
window.fetch[`//api.com/wedding/${itemId}`, function callback[
error,
wedding
] {
// get notified when the result is back
if [error] {
handleError[error];
} else {
getProfile[wedding.groomId, function[groomError, groom] {
if [groomError] {
handleError[groomError];
} else {
getProfile[wedding.brideId, function[brideError, bride] {
if [brideError] {
handleError[brideError];
} else {
callback[{ wedding, bride, groom }];
}
}];
}
}];
}
}];
}
6 không?pause[2000].then[fetchData]
4Điều này sẽ đơn giản hơn nhiều, khiến mọi thứ dường như "đồng bộ"
Vì vậy, là điều này có thể?
Để có thể tạm dừng một chức năng JavaScript, điều gì đó được quyết định trong thời gian chạy JavaScript
Vì vậy, hôm nay chúng ta có đi sâu vào công cụ thời gian chạy JavaScript không?
Không thực sự, tôi không biết nhiều về C++ hoặc bất kỳ ngôn ngữ nào mà thời gian chạy JavaScript được triển khai. 🙈
Nhưng chúng tôi sẽ viết một thời gian chạy đơn giản bằng JavaScript, với một số ràng buộc. [Thôi nào, thật khó để viết toàn bộ thời gian chạy, việc thêm các ràng buộc sẽ giúp tôi hoàn thành nó dễ dàng hơn trong một bài đăng trên blog]
Viết "thời gian chạy"
Hạn chế đầu tiên. điểm vào
Ràng buộc đầu tiên đối với thời gian chạy là phải có một điểm vào
Trong trường hợp của chúng tôi, chúng tôi sẽ biến
function getProfile[userId] {
return window.fetch[`//api.com/user/${userId}`];
}
async function getWeddingDetail[weddingId] {
try {
// pause to get detail through IO
const wedding = await window.fetch[`//api.com/wedding/${weddingId}`];
// and resume when the result is back, and pause again...
const groom = await getProfile[wedding.groomId];
// .. and resume and pause ...
const bride = await getProfile[wedding.brideId];
// .. and resume
return { wedding, bride, groom };
} catch [error] {
handleError[error];
}
}
2 thành điểm vào của chúng tôipause[2000].then[fetchData]
6Vì vậy, thời gian chạy của chúng tôi trông giống như thế này
pause[2000].then[fetchData]
7Ok, vậy là chúng ta có cấu trúc cơ bản, tiếp theo là gì?
Đầu tiên, chúng ta cần tìm cách tạm dừng một hàm JS giữa chừng mà không cần sử dụng
function getProfile[userId, callback] {
return window.fetch[`//api.com/user/${userId}`, callback];
}
function getWeddingDetail[itemId, callback] {
// call IO
window.fetch[`//api.com/wedding/${itemId}`, function callback[
error,
wedding
] {
// get notified when the result is back
if [error] {
handleError[error];
} else {
getProfile[wedding.groomId, function[groomError, groom] {
if [groomError] {
handleError[groomError];
} else {
getProfile[wedding.brideId, function[brideError, bride] {
if [brideError] {
handleError[brideError];
} else {
callback[{ wedding, bride, groom }];
}
}];
}
}];
}
}];
}
6Chà, có
function getProfile[userId] {
return window.fetch[`//api.com/user/${userId}`];
}
async function getWeddingDetail[weddingId] {
try {
// pause to get detail through IO
const wedding = await window.fetch[`//api.com/wedding/${weddingId}`];
// and resume when the result is back, and pause again...
const groom = await getProfile[wedding.groomId];
// .. and resume and pause ...
const bride = await getProfile[wedding.brideId];
// .. and resume
return { wedding, bride, groom };
} catch [error] {
handleError[error];
}
}
4 hoặc function getProfile[userId] {
return window.fetch[`//api.com/user/${userId}`];
}
async function getWeddingDetail[weddingId] {
try {
// pause to get detail through IO
const wedding = await window.fetch[`//api.com/wedding/${weddingId}`];
// and resume when the result is back, and pause again...
const groom = await getProfile[wedding.groomId];
// .. and resume and pause ...
const bride = await getProfile[wedding.brideId];
// .. and resume
return { wedding, bride, groom };
} catch [error] {
handleError[error];
}
}
5, có thể thoát khỏi chức năng JS giữa chừng. Tôi sẽ chọn function getProfile[userId] {
return window.fetch[`//api.com/user/${userId}`];
}
async function getWeddingDetail[weddingId] {
try {
// pause to get detail through IO
const wedding = await window.fetch[`//api.com/wedding/${weddingId}`];
// and resume when the result is back, and pause again...
const groom = await getProfile[wedding.groomId];
// .. and resume and pause ...
const bride = await getProfile[wedding.brideId];
// .. and resume
return { wedding, bride, groom };
} catch [error] {
handleError[error];
}
}
4, phù hợp hơn để thoát chức năng "bất ngờ", thay vì function getProfile[userId] {
return window.fetch[`//api.com/user/${userId}`];
}
async function getWeddingDetail[weddingId] {
try {
// pause to get detail through IO
const wedding = await window.fetch[`//api.com/wedding/${weddingId}`];
// and resume when the result is back, and pause again...
const groom = await getProfile[wedding.groomId];
// .. and resume and pause ...
const bride = await getProfile[wedding.brideId];
// .. and resume
return { wedding, bride, groom };
} catch [error] {
handleError[error];
}
}
5, phù hợp hơn để thoát bình thườngasync function fetchAllData[] {
const data1 = await fetchData1[...]
await pause[1000]
const data2 = await fetchData2[...]
return {...data1, ...data2}
}
3Nhưng trong cả hai trường hợp, không có cách nào để "tiếp tục" chức năng. Tuy nhiên, nó vẫn là một điểm khởi đầu tốt
Một cách để "tiếp tục" chức năng là chạy lại chức năng
function getProfile[userId] {
return window.fetch[`//api.com/user/${userId}`];
}
async function getWeddingDetail[weddingId] {
try {
// pause to get detail through IO
const wedding = await window.fetch[`//api.com/wedding/${weddingId}`];
// and resume when the result is back, and pause again...
const groom = await getProfile[wedding.groomId];
// .. and resume and pause ...
const bride = await getProfile[wedding.brideId];
// .. and resume
return { wedding, bride, groom };
} catch [error] {
handleError[error];
}
}
2async function fetchAllData[] {
const data1 = await fetchData1[...]
await pause[1000]
const data2 = await fetchData2[...]
return {...data1, ...data2}
}
5Bỏ qua tất cả những nghi ngờ mà bạn có về lý do tại sao chạy lại toàn bộ chức năng
function getProfile[userId] {
return window.fetch[`//api.com/user/${userId}`];
}
async function getWeddingDetail[weddingId] {
try {
// pause to get detail through IO
const wedding = await window.fetch[`//api.com/wedding/${weddingId}`];
// and resume when the result is back, and pause again...
const groom = await getProfile[wedding.groomId];
// .. and resume and pause ...
const bride = await getProfile[wedding.brideId];
// .. and resume
return { wedding, bride, groom };
} catch [error] {
handleError[error];
}
}
2 là một ý tưởng tồi để "tiếp tục" chức năng vào lúc nàyViệc triển khai hiện tại không chính xác và sẽ dẫn chúng tôi đến một vòng lặp vô hạn, bởi vì chúng tôi đã "tiếp tục" chức năng "đã tạm dừng" ngay lập tức, điều này chỉ xảy ra sau khi
pause[2000].then[fetchData]
40 thành côngasync function fetchAllData[] {
const data1 = await fetchData1[...]
await pause[1000]
const data2 = await fetchData2[...]
return {...data1, ...data2}
}
8Tuy nhiên, vòng lặp vô hạn vẫn xảy ra, đó là bởi vì
pause[2000].then[fetchData]
40 sẽ trả về đối tượng phản hồi khi "tiếp tục"function getWeddingDetail[itemId, callback] {
// call IO
window.fetch[`//api.com/wedding/${itemId}`, function callback[
error,
wedding
] {
// get notified when the result is back
if [error] {
handleError[error];
} else {
callback[wedding];
}
}];
}
0Làm cách nào để chúng tôi ném Lỗi khi
pause[2000].then[fetchData]
42 được gọi lần đầu tiên và trả về phản hồi cho các cuộc gọi tiếp theo?Người ta có thể đạt được nó bằng cách lưu trữ phản hồi
function getProfile[userId, callback] {
return window.fetch[`//api.com/user/${userId}`, callback];
}
function getWeddingDetail[itemId, callback] {
// call IO
window.fetch[`//api.com/wedding/${itemId}`, function callback[
error,
wedding
] {
// get notified when the result is back
if [error] {
handleError[error];
} else {
getProfile[wedding.groomId, function[groomError, groom] {
if [groomError] {
handleError[groomError];
} else {
getProfile[wedding.brideId, function[brideError, bride] {
if [brideError] {
handleError[brideError];
} else {
callback[{ wedding, bride, groom }];
}
}];
}
}];
}
}];
}
0Nó hoạt động
Sau khi chạy chức năng chính một vài lần, bằng cách "tạm dừng" và "tiếp tục", hay tôi có thể nói là "thoát sớm" và "chạy lại", cuối cùng chúng tôi nhấn vào câu lệnh cuối cùng của chức năng chính và kết thúc chức năng
Ngoại trừ, nếu bạn nhìn vào bảng điều khiển, do chạy lại nhiều lần, chúng tôi thấy
pause[2000].then[fetchData]
43 nhiều lầnĐó là bởi vì,
pause[2000].then[fetchData]
44 có tác dụng phụHạn chế thứ hai. chức năng thuần túy
Hạn chế thứ hai trong thời gian chạy của chúng tôi là chỉ sử dụng các hàm thuần túy. Nếu bạn muốn gọi các hàm có tác dụng phụ, bạn phải sử dụng cấu trúc đặc biệt của chúng tôi,
pause[2000].then[fetchData]
45function getProfile[userId, callback] {
return window.fetch[`//api.com/user/${userId}`, callback];
}
function getWeddingDetail[itemId, callback] {
// call IO
window.fetch[`//api.com/wedding/${itemId}`, function callback[
error,
wedding
] {
// get notified when the result is back
if [error] {
handleError[error];
} else {
getProfile[wedding.groomId, function[groomError, groom] {
if [groomError] {
handleError[groomError];
} else {
getProfile[wedding.brideId, function[brideError, bride] {
if [brideError] {
handleError[brideError];
} else {
callback[{ wedding, bride, groom }];
}
}];
}
}];
}
}];
}
1Vậy,
pause[2000].then[fetchData]
46 được triển khai như thế nào?function getProfile[userId, callback] {
return window.fetch[`//api.com/user/${userId}`, callback];
}
function getWeddingDetail[itemId, callback] {
// call IO
window.fetch[`//api.com/wedding/${itemId}`, function callback[
error,
wedding
] {
// get notified when the result is back
if [error] {
handleError[error];
} else {
getProfile[wedding.groomId, function[groomError, groom] {
if [groomError] {
handleError[groomError];
} else {
getProfile[wedding.brideId, function[brideError, bride] {
if [brideError] {
handleError[brideError];
} else {
callback[{ wedding, bride, groom }];
}
}];
}
}];
}
}];
}
2Những gì chúng tôi đang cố gắng làm ở đây là, chúng tôi đẩy tất cả các tác dụng phụ vào một mảng và chỉ chạy tất cả chúng khi cuối cùng chúng tôi hoàn thành chức năng
function getProfile[userId] {
return window.fetch[`//api.com/user/${userId}`];
}
async function getWeddingDetail[weddingId] {
try {
// pause to get detail through IO
const wedding = await window.fetch[`//api.com/wedding/${weddingId}`];
// and resume when the result is back, and pause again...
const groom = await getProfile[wedding.groomId];
// .. and resume and pause ...
const bride = await getProfile[wedding.brideId];
// .. and resume
return { wedding, bride, groom };
} catch [error] {
handleError[error];
}
}
2 của mìnhVà nếu chúng ta "tạm dừng" hàm của mình, trước khi chạy lại hàm
function getProfile[userId] {
return window.fetch[`//api.com/user/${userId}`];
}
async function getWeddingDetail[weddingId] {
try {
// pause to get detail through IO
const wedding = await window.fetch[`//api.com/wedding/${weddingId}`];
// and resume when the result is back, and pause again...
const groom = await getProfile[wedding.groomId];
// .. and resume and pause ...
const bride = await getProfile[wedding.brideId];
// .. and resume
return { wedding, bride, groom };
} catch [error] {
handleError[error];
}
}
2 để "tiếp tục", chúng ta sẽ xóa tất cả các tác dụng phụ, vì các tác dụng phụ tương tự sẽ lại được đẩy vào mảngChạy lại, và vâng, nó hoạt động
Bạn có thể dùng thử mã hoàn chỉnh trong CodeSandbox
Chúng ta đã làm gì cho đến nay?
Để bắt chước tạm dừng và tiếp tục một hàm trong JavaScript, chúng ta có thể đưa ra một lỗi để "tạm dừng" việc thực thi hàm giữa chừng và "tiếp tục" nó bằng cách chạy lại hàm
Để "tiếp tục" từ nơi dừng lại, thay vào đó, điểm mà chúng tôi đã đưa ra lỗi sẽ trả về một giá trị, để có cảm giác như chúng tôi đang tiếp tục và tiếp tục từ điểm đó. Để đạt được điều này, chúng ta có thể sử dụng một số cơ chế lưu trữ
Cuối cùng, để chạy lại hàm nhiều lần một cách an toàn, chúng ta cần đảm bảo rằng hàm đó thuần túy. Nếu có tác dụng phụ, chúng ta cần thu thập chúng và chỉ áp dụng khi chức năng đã đi đến thành công
Được, tuyệt đấy. Tại sao chúng ta lại làm việc này?
Chà, ý tưởng về cách tạm dừng và tiếp tục một hàm JavaScript xuất hiện khi tôi đang đọc về React Suspense. Với Suspense, việc tìm nạp/nhận dữ liệu có thể được viết một cách khai báo
function getProfile[userId, callback] {
return window.fetch[`//api.com/user/${userId}`, callback];
}
function getWeddingDetail[itemId, callback] {
// call IO
window.fetch[`//api.com/wedding/${itemId}`, function callback[
error,
wedding
] {
// get notified when the result is back
if [error] {
handleError[error];
} else {
getProfile[wedding.groomId, function[groomError, groom] {
if [groomError] {
handleError[groomError];
} else {
getProfile[wedding.brideId, function[brideError, bride] {
if [brideError] {
handleError[brideError];
} else {
callback[{ wedding, bride, groom }];
}
}];
}
}];
}
}];
}
3pause[2000].then[fetchData]
49 sẽ thực sự lấy dữ liệu từ mạng không đồng bộ, nhưng làm thế nào mà React làm cho nó giống như là đồng bộ?Hãy nghĩ về cách bạn sẽ viết trong React
- Thay vì cung cấp một điểm vào, chức năng
60 của bạn là điểm vào cho React. Để "tiếp tục" mỗi lần "tạm dừng" kết xuất, React gọi hàmpause[2000].then[fetchData]
60 nhiều lầnpause[2000].then[fetchData]
- Chức năng kết xuất của bạn phải thuần túy và không có tác dụng phụ
- Để
46, bạn sử dụngpause[2000].then[fetchData]
63 thay thếpause[2000].then[fetchData]
- Để tìm nạp + bộ đệm, bạn sử dụng
64 để tạo tài nguyênpause[2000].then[fetchData]
- Ngoại trừ, thay vì "tạm dừng" và không làm gì cả, React xử lý "tạm dừng" với thành phần
65 gần nhất để hiển thị một số nội dung dự phòng. Khi lời hứa được giải quyết, React "tiếp tục" kết xuất và kết xuất nội dung với dữ liệupause[2000].then[fetchData]
Tuy nhiên, đây không phải là hồi hộp
Không, tôi không nghĩ vậy
Sự hồi hộp dựa trên một số khái niệm lập trình chức năng, được gọi là "sự tiếp tục được phân tách bằng một lần", được giải thích trong "Hiệu ứng đại số cho phần còn lại của chúng ta" của Dan Abramov
Ghi chú kết thúc
Toàn bộ bài viết này dựa trên một thử nghiệm tưởng tượng mà tôi đã có khi cố gắng tìm hiểu cơ chế của React Suspense. Vì vậy, xin thứ lỗi cho tôi nếu dòng chảy của nội dung hơi khó hiểu hoặc thô thiển
Tuy nhiên, sau khi viết ra quá trình suy nghĩ của mình, tôi đã nghiên cứu thêm và nhận ra rằng "tạm dừng và tiếp tục thực thi" là một khái niệm gọi là "sự tiếp tục" trong lập trình chức năng