Tugas mencipta janji untuk fungsi yang tidak mengembalikan apa-apa, seperti setTimeout, pada mulanya boleh mencabar. Untuk memahami konsep ini, mari rujuk contoh kod yang diubah suai:
<br>fungsi async(panggilan balik){</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">setTimeout(function(){ callback(); }, 5000);
}
async(function(){
console.log('async called back');
});
Matlamat kami adalah untuk menjana janji bahawa async boleh kembali setelah panggilan balik setTimeout selesai sedia.
Menggunakan janji asli, kita boleh mencipta fungsi yang dipanggil kemudian seperti berikut:
berfungsi kemudian (kelewatan) {
return new Promise(function(resolve) { setTimeout(resolve, delay); });
}
Fungsi ini mengambil masa kelewatan dalam milisaat dan mengembalikan janji yang diselesaikan selepas kelewatan tamat tempoh.
< ;h3>Lengah Asas dengan Value
Untuk mengubah suai kemudian dan membenarkannya melepasi nilai resolusi, kita perlu memastikan panggilan balik setTimeout menerima nilai sebagai hujah. Untuk penyemak imbas yang menyokong menyediakan hujah tambahan untuk setTimeout, kod berikut boleh digunakan:
fungsi kemudian(kelewatan, nilai) {
return new Promise(function(resolve) { setTimeout(resolve, delay, value); });
}
Kod ini memastikan bahawa nilai dihantar ke panggilan balik dan seterusnya diselesaikan dengan janji.
Untuk kes di mana kami ingin memberikan keupayaan untuk membatalkan tamat masa, kami boleh mencipta objek dengan kaedah membatalkan dan pelengkap untuk janji. Apabila kaedah pembatalan dipanggil, ia mengosongkan tamat masa dan menolak janji:
<br>const later = (kelewatan, nilai) => {</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">let timer = 0; let reject = null; const promise = new Promise((resolve, _reject) => { reject = _reject; timer = setTimeout(resolve, delay, value); }); return { get promise() { return promise; }, cancel() { if (timer) { clearTimeout(timer); timer = 0; reject(); reject = null; } } };
};
Pendekatan ini menyediakan cara untuk membatalkan tamat masa yang belum selesai dan menolak janji yang berkaitan.
Atas ialah kandungan terperinci Bagaimana untuk Mengubah Fungsi `setTimeout` menjadi Janji?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!