انگولار - اختصاص دادن noop به یک متغیر


من در حال بررسی کد منبع ابزارهای Angular بودم و به خط زیر برخورد کردم:

export const NOOP: any = () => {};

خب، موارد بالا تا حدودی واضح است. یک متغیر اعلام کنید که هیچ عملی انجام ندهد. حالا در همان کتابخانه متد زیر را دارم:

export function resolveViewDefinition(factory: ViewDefinitionFactory): ViewDefinition {
  let value: ViewDefinition = VIEW_DEFINITION_CACHE.get(factory) !;
  if (!value) {
    value = factory(() => NOOP);
    value.factory = factory;
    VIEW_DEFINITION_CACHE.set(factory, value);
  }
  return value;
}

تأثیر عدم وجود همان خط و گذاشتن آن در حالت کامنت و داشتن بلوک به صورت زیر چه خواهد بود:

  if (!value) {
    // value = factory(() => NOOP);
    value.factory = factory;
    VIEW_DEFINITION_CACHE.set(factory, value);
  }

ممکن است کسی در مورد این خط بیشتر توضیح دهد:

value = factory(() => NOOP);

و روشنتر کردن آن؟ من میتوانم ببینم چه اتفاقی میافتد اما نمیتوانم اثرات حذف آن را درک کنم.

پاسخ شماره ۱

تابع resolveViewDefinition برای دریافت تعریف نما استفاده میشود. ابتدا سعی میکند value را از حافظه پنهان بگیرد و اگر مقدار ذخیرهشدهای وجود نداشت، سپس ViewDefinitionFactory را فراخوانی میکند.

ViewDefinitionFactory یک تابع را به عنوان پارامتر میگیرد. چرا؟

/**
 * Factory for ViewDefinitions.
 * We use a function so we can reexecute it in case an error happens and use the given logger
 * function to log the error from the definition of the node, which is shown in all browser
 * logs.
 */
export interface ViewDefinitionFactory { (logger: NodeLogger): ViewDefinition; }

ما نیازی به ثبت خطاها نداریم وقتی که فقط در حال گرفتن ViewDefinition هستیم، بنابراین با تابع NOOP فراخوانی شده است.

اما وقتی هنگام اجرای برخی اقدامات درون قالب خطا دریافت میکنیم، Angular این کارخانه را با NodeLogger اجرا میکند تا مشخص کند کدام نود باعث خطا شده است.

بیایید مثال Plunker را ببینیم

@Component({
  selector: 'my-app',
  template: `<h2 (click)="x()">Hello</h2>`
})
export class App {}

اینجا کارخانه است

function View_App_0(l) {
  return jit_viewDef1(0,[
      (l()(),jit_elementDef2(0,null,null,1,'h2',[],null,[[
        null,
        'click'
      ]
    ],function(v,en,$event) {
      var ad = true;
      var co = v.component;
      if (('click' === en)) {
        var pd_0 = (co.x() !== false);
        ad = (pd_0 && ad);
      }
      return ad;
    },null,null)),
    (l()(),jit_textDef3(null,['Hello']))
  ]
  ,null,null);
}

۱) اجرای برنامه

function resolveViewDefinition(factory) {
    var value = ((VIEW_DEFINITION_CACHE.get(factory))); // we haven't cached it yet 
    if (!value) { // value is undefined 
        value = factory(function () { return NOOP; }); //get ViewDefinition but do not log errors
        value.factory = factory; // save link to the factory so it can be used later
        VIEW_DEFINITION_CACHE.set(factory, value); // store factory
    }
    return value;
}

۲) پس از کلیک روی Hello

((logViewDef.factory))(nodeLogger); // use saved link to call factory with logger