Dalam dunia pengaturcaraan tak segerak, janji berkuasa tinggi sebagai satu cara untuk mengurus aliran peristiwa tak segerak . Walau bagaimanapun, menerima janji dalam setiap situasi boleh menjadi menakutkan, terutamanya apabila berurusan dengan fungsi seperti setTimeout yang sememangnya tidak mempunyai antara muka berasaskan janji yang wujud.
Untuk menyepadukan setTimeout dengan lancar ke alam kuasa janji, pertimbangkan pendekatan berikut:
Katakan kita ingin meneroka asas mencipta janji daripada setTimeout. Pelaksanaan mudah boleh menyerupai ini:
function setTimeoutPromise(delay) { return new Promise((resolve) => { setTimeout(resolve, delay); }); }
Di sini, kami memanfaatkan pembina Promise untuk memulakan janji yang merangkumi pelaksanaan tertunda setTimeout.
Meningkatkan janji kami untuk meluluskan nilai resolusi adalah sama mudah dalam persekitaran yang menyokong hujah tambahan untuk setTimeout. Begini cara kami mencapainya:
function setTimeoutValuePromise(delay, value) { return new Promise((resolve) => { setTimeout(resolve, delay, value); // Ensure that 'delay' comes before 'value' in argument order }); }
Janji sememangnya tidak berubah, tetapi kami boleh melanjutkan pelaksanaan kami untuk menyediakan lebih fleksibiliti dengan memperkenalkan kelewatan yang boleh dibatalkan. Dengan membalut janji dalam objek, kami memperoleh keupayaan untuk membatalkan tamat masa jika perlu.
function cancellableSetTimeout(delay, value) { let timer; let reject; const promise = new Promise((resolve, _reject) => { reject = _reject; timer = setTimeout(() => resolve(value), delay); }); return { promise, cancel() { if (timer) { clearTimeout(timer); timer = null; reject(); reject = null; } }, }; }
Pelaksanaan ini membolehkan pembatalan kelewatan, memberikan tahap kawalan yang tidak tersedia secara asal dengan janji sahaja.
Untuk menyaksikan kuasa janji dalam tindakan, pertimbangkan contoh interaktif ini:
// Create a cancellable setTimeout const cancellableTimeout = cancellableSetTimeout(100, "Message from timeout"); // Handle the promise resolution cancellableTimeout.promise .then((result) => console.log(result)) // Log the resolved value .catch(() => console.log("Timeout cancelled")); // Log if the timeout was cancelled // Simulate cancellation setTimeout(() => { cancellableTimeout.cancel(); // Cancel the timeout after a brief delay }, 50);
Demonstrasi ini mempamerkan pendekatan berasaskan janji, menonjolkan kedua-dua nilai penyelesaian dan fungsi pembatalan.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengintegrasikan `setTimeout` dengan Janji untuk Operasi Asynchronous?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!