JavaScript-ում կատարված պրոմիսների ստեղծում
Երբեմն կարող է անհրաժեշտ լինել ստեղծել արդեն
կատարված պրոմիս: Դրա համար գոյություն ունեն
երկու մեթոդ՝ Promise.resolve մեթոդը
ստեղծում է հաջողությամբ կատարված պրոմիս, Promise.reject
մեթոդը ստեղծում է մերժված պրոմիս: Պարամետրով այս
մեթոդները ստանում են այն, ինչը կդառնա պրոմիսի
արդյունքը կամ սխալը համապատասխանաբար:
Ե՞րբ կարող է մեզ անհրաժեշտ լինել արդեն կատարված պրոմիս: Դիտարկենք օրինակով: Ենթադրենք, մենք ունենք ինչ-որ ֆունկցիա, որը պարամետրով ընդունում է թիվ, ինչ-որ բան անում է դրա հետ ասինխրոն կերպով և վերադարձնում է պրոմիս արդյունքով:
function func(num) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
}
Մենք կօգտագործենք մեր ֆունկցիան հետևյալ կերպով.
func(5).then(function(res) {
console.log(res); // կարտածի 25
});
Ենթադրենք, որ այժմ մենք որոշել ենք, որ մեր ասինխրոն գործողությունը կկատարենք միայն այն դեպքում, եթե փոխանցված թիվը մեծ է զրոյից: Հակառակ դեպքում ֆունկցիայի արդյունքը պետք է լինի զրո.
function func(num) {
if (num > 0) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
} else {
return 0; // զրոյական արդյունք
}
}
Սակայն, այժմ ստացվում է, որ ֆունկցիան վերադարձնում է
կամ պրոմիս, կամ թիվ: Դրա պատճառով մենք այլևս
չենք կարող կիրառել then մեթոդը ֆունկցիայի
արդյունքի նկատմամբ, քանի որ ֆունկցիայի կողմից
թիվ վերադարձնելու դեպքում մենք կստանանք սխալ.
func(0).then(function(res) { // սխալ, then մեթոդը կիրառում ենք զրոյի նկատմամբ
});
Խնդիրը լուծելու համար մեզ կօգնի Promise.resolve.
function func(num) {
if (num > 0) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
} else {
return Promise.resolve(0); // վերադարձնում ենք պրոմիս, այլ ոչ թե թիվ
}
}
Ենթադրենք, որ այժմ մենք որոշել ենք, որ փոխանցված
զրոյի համար պետք է վերադարձնել զրո, իսկ զրոյից
փոքր թվերի համար՝ բացառություն: Այս հարցում մեզ կօգնի
Promise.reject մեթոդը.
function 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'); // կվերադարձնենք մերժված պրոմիս
}
}