Sobes.tech
Middle

Խոսեք setTimeout ֆունկցիայի օգտագործման հատուկ դեպքի մասին, երբ ժամանակը զրո է։

sobes.tech AI

Պատասխան AI-ից

setTimeout(callback, 0) տեղադրում է callback-ը մակրոտասքների հերթում (macrotask queue): callback-ի ներսում գտնվող կոդը կիրականանա այն ժամանակ, երբ ընթացիկ զանգվածային կանչերի շղթան դատարկ լինի և հաջորդ մակրոտասքային ցիկլը սկսվի event loop-ով:

Հիմնական օգտագործման դեպքեր՝

  • Հետաձգված կատարմամբ՝ ռենդերից հետո: Հնարավորություն է տալիս կատարել կոդը այն ժամանակ, երբ բրաուզերը մշակել է DOM-ի ընթացիկ փոփոխությունները:
    // DOM տարրին փոփոխություն
    element.textContent = 'Նոր տեքստ';
    
    // Հետաձգված գործողություն, որը կախված է թարմացված DOM-ից
    setTimeout(() => {
      console.log('DOM թարմացվել է, կարելի է աշխատել նոր վիճակի հետ');
    }, 0);
    
  • Երկարատև գործողությունների բաժանում: Օգնում է կանխել հիմնական հոսքի բլոկավորումը՝ բաժանելով երկար հաշվարկները փոքր մասերի, որոնք կատարվում են առանձին միկրոտասքերում (macrotasks):
    function processLargeData(data) {
      let i = 0;
      function processChunk() {
        const chunkSize = 1000;
        const end = Math.min(i + chunkSize, data.length);
    
        // Տվյալների մասի մշակումը
        for (let j = i; j < end; j++) {
          // ինչ-որ բան անել data[j]-ի հետ
        }
    
        i = end;
        if (i < data.length) {
          // հետաձգել հաջորդ մասը
          setTimeout(processChunk, 0);
        } else {
          console.log('Մշակումը ավարտված է');
        }
      }
      processChunk();
    }
    
  • Կատարման փոխանցում՝ հիմնական սցրիպտի ավարտից հետո: Գаранտիա է, որ որոշակի կոդ կիրականանա այն ժամանակ, երբ լրիվ և սինխրոնային բոլոր գործողությունները ավարտվեն:
    console.log('Սկիզբ սցրիպտի');
    
    setTimeout(() => {
      console.log('Կատարվում է հիմնական սցրիպտից հետո');
    }, 0);
    
    console.log('Սցրիպտի վերջը');
    // Արդյունք՝
    // Սկիզբ սցրիպտի
    // Սցրիպտի վերջը
    // Կատարվում է հիմնական սցրիպտից հետո
    

Կարևոր է հասկանալ, որ զրո մինուտով դադարեցումը չի նշանակում անմիջական կատարմամբ։ Կատարման ժամանակը կախված է event loop-ի բեռնվածությունից և հերթերում գտնվող այլ առաջադրանքներից (հատկապես միկրոտասքերից առաջ մուտք գործած առաջադրանքներից):