Rumah >hujung hadapan web >tutorial js >Mengapakah menggunakan setTimeout dalam rantaian janji memutuskan rantaian, dan bagaimanakah ia boleh diperbaiki?

Mengapakah menggunakan setTimeout dalam rantaian janji memutuskan rantaian, dan bagaimanakah ia boleh diperbaiki?

Patricia Arquette
Patricia Arquetteasal
2024-10-29 02:48:021077semak imbas

Why does using setTimeout in a promise chain break the chain, and how can it be fixed?

Menggunakan setTimeout pada Promise Chain

Promise menyediakan susunan berurutan bagi operasi tak segerak, membenarkan pembangun bekerja dengan kod berasaskan panggilan balik seolah-olah ia adalah segerak. Walau bagaimanapun, memperkenalkan kelewatan antara operasi dalam rantai janji boleh menimbulkan cabaran.

Soalan:

Dalam coretan kod yang disediakan, kelewatan cuba menggunakan setTimeout, tetapi ia menghasilkan dalam ralat penghuraian JSON. Mengapa ini berlaku, dan bagaimanakah ia boleh diselesaikan?

<code class="javascript">...
getLinks('links.txt').then(function(links){
    let all_links = (JSON.parse(links));
    globalObj=all_links;

    return getLinks(globalObj["one"]+".txt");

}).then(function(topic){
    writeToBody(topic);
    setTimeout(function(){
         return getLinks(globalObj["two"]+".txt"); // without setTimeout it works fine
         },1000);
});
...</code>

Jawapan:

Isu timbul kerana setTimeout tidak mengembalikan janji. Secara lalai, apabila anda mengembalikan nilai daripada rantai janji, ia dibalut dengan objek janji yang diselesaikan. Walau bagaimanapun, memandangkan setTimeout mengembalikan ID pemasa, rantai janji rosak dan nilai yang dikembalikan tidak dianggap sebagai janji.

Untuk menyelesaikan masalah ini, pendekatan berikut boleh digunakan:

1. Buat Fungsi Kelewatan di Luar Rantaian Janji:

Daripada menggunakan setTimeout, tentukan fungsi kelewatan yang membungkus kelewatan dalam janji:

<code class="javascript">function delay(t, val) {
    return new Promise(resolve => setTimeout(resolve, t, val));
}</code>

Kod Kemas Kini:

<code class="javascript">...
getLinks('links.txt').then(function(links){
    let all_links = (JSON.parse(links));
    globalObj=all_links;

    return getLinks(globalObj["one"]+".txt");

}).then(function(topic){
    writeToBody(topic);
    // return a promise here that will be chained to prior promise
    return delay(1000).then(function() {
        return getLinks(globalObj["two"]+".txt");
    });
});
...</code>

2. Tambahkan Kaedah Kelewatan pada Objek Janji:

Penyelesaian yang lebih elegan ialah memanjangkan objek Promise dengan kaedah kelewatan:

<code class="javascript">Promise.prototype.delay = function(t) {
    return this.then(function(val) {
        return delay(t, val);
    });
}</code>

Kod Kemas Kini:

<code class="javascript">...
getLinks('links.txt').then(function(links){
    let all_links = (JSON.parse(links));
    globalObj=all_links;

    return getLinks(globalObj["one"]+".txt");

}).then(function(topic){
    writeToBody(topic);
    // return a promise using the delay method
    return Promise.resolve().delay(1000).then(function() {
        return getLinks(globalObj["two"]+".txt");
    });
});
...</code>

Dengan menggunakan teknik ini, anda boleh memperkenalkan kelewatan dalam rantai janji tanpa menjejaskan gelagat rantaian dan mengelakkan ralat masa jalan.

Atas ialah kandungan terperinci Mengapakah menggunakan setTimeout dalam rantaian janji memutuskan rantaian, dan bagaimanakah ia boleh diperbaiki?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn