deferexecution () در کد منبع اصلاح. – جامعه dev

در این مقاله ، ما تابعی به نام deferexecution () را در کد منبع پالایش بررسی خواهیم کرد.
/**
* Delays the execution of a callback function asynchronously.
* This utility function is used to defer the execution of the provided
* callback, allowing the current call stack to clear before the callback
* is invoked. It is particularly useful for ensuring non-blocking behavior
* and providing a clear intent when a 0 ms timeout is used.
*/
export const deferExecution = (fn: Function) => {
setTimeout(fn, 0);
};
این قطعه کد فوق از Refinedev/Refine/Packages/Core/SRC/Definitions/Helpers/Defer-Exection/index.ts انتخاب می شود.
این کد در داخل پوشه ای به نام Defer-Exection است. این شامل پرونده های نشان داده شده در تصویر زیر است.
بنابراین Deferexecution برای چه چیزی استفاده می شود؟
/**
به تأخیر می اندازد که عملکرد پاسخ به تماس را به صورت غیر همزمان انجام می دهد. این تابع ابزار برای به تعویق انداختن اجرای ارائه شده استفاده می شود
پاسخ به تماس ، اجازه می دهد تا پشته تماس فعلی قبل از پاسخ به تماس پاک شود فراخوانده شده است این امر به ویژه برای اطمینان از رفتار غیر مسدود کننده مفید است
و ارائه یک هدف واضح هنگام استفاده از زمان 0 میلی ثانیه. /
این اظهار نظر در بالا عملکرد به وضوح توضیح می دهد که این عملکرد چیست.
زمان ، در میلی ثانیه که تایمر باید قبل از اجرای عملکرد یا کد مشخص شده منتظر بماند. اگر این پارامتر حذف شود ، از مقدار 0 استفاده می شود ، به این معنی که “بلافاصله” یا دقیق تر چرخه رویداد بعدی را اجرا کنید. اطلاعات بیشتر در مورد SetTimeOut را بخوانید.
صبر کنید ، چرخه رویداد چیست؟ برای این کار ، شما باید در مورد صف کار و حلقه رویداد در مستندات مدل اجرای JavaScript بخوانید
هنگامی که پشته خالی باشد ، کار در نظر گرفته می شود. سپس ، کار بعدی از صف کشیده می شود. مشاغل ممکن است با اولویت یکنواخت کشیده نشوند – به عنوان مثال ، حلقه های رویداد HTML مشاغل را به دو دسته تقسیم می کنند: وظایف وت ریزه کاریبشر ریزگردها از اولویت بالاتری برخوردار هستند و صف میکروتاسک ابتدا قبل از کشیدن صف کار تخلیه می شود.
خوب ، در این مرحله ، بیایید دریابیم که چگونه از این deferexecution در پایگاه کد پالایش استفاده می شود.
استفاده از deferexecution
if (!isPessimistic && !isAutosave) {
// If the mutation mode is not pessimistic, handle the redirect immediately in an async manner
// `setWarnWhen` blocks the redirects until set to `false`
// If redirect is done before the value is properly set, it will be blocked.
// We're deferring the execution of the redirect to ensure that the value is set properly.
deferExecution(() => onSuccessRedirect());
// Resolve the promise immediately
resolve();
}
این قطعه کد یک نمونه است که از قلاب/فرم/index.ts انتخاب شده است
اما من تعجب می کنم که هیچ پاکسازی به این معنا وجود ندارد
آزمایش deferexecution ()
پرونده ای به نام Defer-Execution/index.spec.ts حاوی کد زیر را پیدا خواهید کرد:
import { waitFor } from "@testing-library/react";
import { deferExecution } from ".";
describe("deferExecution", () => {
beforeEach(() => {
jest.useRealTimers();
});
afterEach(() => {
jest.useFakeTimers();
});
it("should defer the call after caller returns", async () => {
const array: number[] = [];
const fn = () => {
array.push(1);
deferExecution(() => {
array.push(3);
});
array.push(2);
};
fn();
await waitFor(() => {
expect(array).toEqual([1, 2, 3]);
});
});
});
arr.push (3) در داخل deferexecution نامیده می شود و نتیجه آن تأیید می شود [1, 2, 3]بشر
درباره من:
سلام ، نام من رامو ناراسینگا است. من پروژه های بزرگ منبع باز را مطالعه می کنم و در مورد معماری پایگاه کد آنها و بهترین شیوه ها مطالب ایجاد می کنم و آن را از طریق مقاله ، فیلم به اشتراک می گذارم.
من برای کار روی پروژه های جالب باز هستم. برای من ایمیل بفرستید در ramu.narasinga@gmail.com
GitHub من-https://github.com/ramu-narasinga
وب سایت من – https://ramunarasinga.com
کانال یوتیوب من – https://www.youtube.com/@thinkthroo
پلت فرم یادگیری – https://thinkthroo.com
معماری پایگاه کد – https://app.thinkthroo.com/architecture
بهترین روشها-https://app.thinkthroo.com/best-practices
پروژه های درجه تولید-https://app.thinkthroo.com/production-prade-projects
منابع:
-
https://github.com/refinedev/refine/blob/main/packages/core/src/definitions/helpers/defer-execution/index.ts#l8
-
https://github.com/refinedev/refine/blob/main/packages/core/src/hooks/form/index.ts#l292
-
https://github.com/refinedev/refine/tree/main/packages/core/src/definitions/helpers/defer-execution
-
https://developer.mozilla.org/en-us/docs/web/api/window/settimeout
-
https://developer.mozilla.org/en-us/docs/web/javascript/reference/execution_model#job_quue_and_event_loop
-
https://github.com/refinedev/refine/blob/main/packages/core/src/definitions/helpers/defer-execution/index.spec.tsts