Дар 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('рақами нодуруст'); // промисои радшударо бармегардонем
}
}