برنامه نویسی

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

منابع:

  1. https://github.com/refinedev/refine/blob/main/packages/core/src/definitions/helpers/defer-execution/index.ts#l8

  2. https://github.com/refinedev/refine/blob/main/packages/core/src/hooks/form/index.ts#l292

  3. https://github.com/refinedev/refine/tree/main/packages/core/src/definitions/helpers/defer-execution

  4. https://developer.mozilla.org/en-us/docs/web/api/window/settimeout

  5. https://developer.mozilla.org/en-us/docs/web/javascript/reference/execution_model#job_quue_and_event_loop

  6. https://github.com/refinedev/refine/blob/main/packages/core/src/definitions/helpers/defer-execution/index.spec.tsts

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا