Введение в промисы дар JavaScript
Шумо аллакай медонед, ки истифодаи модели зангҳои асинхронӣ ба осонӣ ба вазъияти callback hell меорад. Аз ин рӯ, дар JavaScript модели нав бо номи промисҳо (promise) ворид шуд. Биёед ин модельро омӯзем.
Промис объектест, ки функсия ҳамчун параметр ба он дода мешавад, дар дохили он бояд рамзи асинхрониро ҷойгир кунем:
let promise = new Promise(function() {
// рамзи асинхронӣ
});
Ҳамон тавре ки мебинед, ман объекти промисро
дар тағирёбандаи promise сабт кардам. Дар як ҷои дигари рамз
метавонам ба ин тағирёбанда усули then-ро татбиқ кунам, функсияеро ба он гузорам
бо рамзе, ки бояд баъди анҷомёбии рамзи асинхронӣ, навишташуда
дар вақти эҷоди ин промис, иҷро шавад:
promise.then(function() {
// баъди анҷоми рамзи асинхронӣ иҷро мешавад
});
Гӯё машшашат аст, аз ин рӯ биёед ба мисол нигарем. Фарз кунем, ки ман чунин рамзи асинхрони дорам:
setTimeout(function() {
let result = [1, 2, 3, 4, 5];
}, 3000);
Фарз кунем, ки мехоҳам барои он вазифаи асосии
асинхрониро ҳал кунем: баъди фаъол шудани таймер
каме рамз иҷро кунам. Дар ҳоле ки
мехоҳам ин рамзро дар худи таймер ҷойгир накунам
ва мехоҳам, ки ба ин рамз натиҷае,
ки ман дар тағирёбандаи result навиштам, ба тавре дастрас шавад.
Дар асл, мо ин вазифаро дар дарсҳои гузашта
тавассути зангҳо ва обунаҳо ҳал мекардем. Биёед
акнун бинем, ки инро чӣ гуна тавассути промисҳо анҷом диҳем.
Аввалан рамзи асинхрониро бояд дар промис печоним:
let promise = new Promise(function() {
setTimeout(function() {
let result = [1, 2, 3, 4, 5];
}, 3000);
});
Ин, аммо, кофӣ нест. Мо бояд ба таври равшан ишора кунем, ки рамзи асинхрони мо анҷом ёфт. Дар ин ба мо функсияи махсуси анҷомдиҳӣ кӯмак мекунад, ки ба таври худкор ба параметри якуми функсия меафтад, агар он ишора шуда бошад:
let promise = new Promise(function(resolve) { // параметрро ишора мекунем
setTimeout(function() {
let result = [1, 2, 3, 4, 5];
}, 3000);
});
Бо ёрии функсияи анҷомдиҳӣ мо метавонем ба таври равшан ба промис ишора кунем, ки рамзи асинхронӣ анҷом ёфт. Барои ин мо бояд ин функсияро дар ҷое, ки лозим аст, даъват кунем:
let promise = new Promise(function(resolve) {
setTimeout(function() {
let result = [1, 2, 3, 4, 5];
resolve(); // промисро анҷом медиҳем
}, 3000);
});
Дар ин ҳол, агар мехоҳем ба берун ягон натиҷаи рамзи асинхрониро бифиристем, метавонем онро ҳамчун параметри функсияи анҷомдиҳии худ бифиристем:
let promise = new Promise(function(resolve) {
setTimeout(function() {
let result = [1, 2, 3, 4, 5];
resolve(result); // натиҷаро мефиристем
}, 3000);
});
Албатта, метавон аз тағирёбандаи миёнара холӣ шуд:
let promise = new Promise(function(resolve) {
setTimeout(function() {
resolve([1, 2, 3, 4, 5]);
}, 3000);
});
Акнун дар ҳама ҷойҳои дигар мо метавонем
усули then-и промиси худро даъват кунем:
promise.then(function() {
// баъди анҷоми промис фаъол мешавад
});
Натиҷаи кори промис ба параметри якуми функсия меафтад, агар мо хоҳем, ки онро ишора кунем:
promise.then(function(result) {
console.log(result); // массивро бо натиҷа бармегардонад
});
Промис созед, ки дар дохили он таъхир
то 5 сония бошад, баъд аз он промис бояд
анҷом ёбад, бо натиҷаи худ кадом матнеро
баргардонад. Ин матнро ба экран чоп кунед.