JavaScript-ում կատարված պրոմիսների ստեղծում

Երբեմն կարող է անհրաժեշտ լինել ստեղծել արդեն կատարված պրոմիս: Դրա համար գոյություն ունեն երկու մեթոդ՝ Promise.resolve մեթոդը ստեղծում է հաջողությամբ կատարված պրոմիս, Promise.reject մեթոդը ստեղծում է մերժված պրոմիս: Պարամետրով այս մեթոդները ստանում են այն, ինչը կդառնա պրոմիսի արդյունքը կամ սխալը համապատասխանաբար:

Ե՞րբ կարող է մեզ անհրաժեշտ լինել արդեն կատարված պրոմիս: Դիտարկենք օրինակով: Ենթադրենք, մենք ունենք ինչ-որ ֆունկցիա, որը պարամետրով ընդունում է թիվ, ինչ-որ բան անում է դրա հետ ասինխրոն կերպով և վերադարձնում է պրոմիս արդյունքով:

javascriptfunction func(num) {
  return new Promise(function(resolve) {
    setTimeout(function() {
      resolve(num * num);
    }, 3000);
  });
}

Մենք կօգտագործենք մեր ֆունկցիան հետևյալ կերպով.

javascriptfunc(5).then(function(res) {
  console.log(res); // կարտածի 25
});

Ենթադրենք, որ այժմ մենք որոշել ենք, որ մեր ասինխրոն գործողությունը կկատարենք միայն այն դեպքում, եթե փոխանցված թիվը մեծ է զրոյից: Հակառակ դեպքում ֆունկցիայի արդյունքը պետք է լինի զրո.

javascriptfunction func(num) {
  if (num > 0) {
    return new Promise(function(resolve) {
      setTimeout(function() {
        resolve(num * num);
      }, 3000);
    });
  } else {
    return 0; // զրոյական արդյունք
  }
}

Սակայն, այժմ ստացվում է, որ ֆունկցիան վերադարձնում է կամ պրոմիս, կամ թիվ: Դրա պատճառով մենք այլևս չենք կարող կիրառել then մեթոդը ֆունկցիայի արդյունքի նկատմամբ, քանի որ ֆունկցիայի կողմից թիվ վերադարձնելու դեպքում մենք կստանանք սխալ.

javascriptfunc(0).then(function(res) { // սխալ, then մեթոդը կիրառում ենք զրոյի նկատմամբ
  
});

Խնդիրը լուծելու համար մեզ կօգնի Promise.resolve.

javascriptfunction func(num) {
  if (num > 0) {
    return new Promise(function(resolve) {
      setTimeout(function() {
        resolve(num * num);
      }, 3000);
    });
  } else {
    return Promise.resolve(0); // վերադարձնում ենք պրոմիս, այլ ոչ թե թիվ
  }
}

Ենթադրենք, որ այժմ մենք որոշել ենք, որ փոխանցված զրոյի համար պետք է վերադարձնել զրո, իսկ զրոյից փոքր թվերի համար՝ բացառություն: Այս հարցում մեզ կօգնի Promise.reject մեթոդը.

javascriptfunction func(num) {
  if (num > 0) {
    return new Promise(function(resolve) {
      setTimeout(function() {
        resolve(num * num);
      }, 3000);
    });
  } else if (num === 0) {
    return Promise.resolve(0);
  } else {
    return Promise.reject('incorrect number'); // կվերադարձնենք մերժված պրոմիս
  }
}