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
Lepaskan: 2024-10-29 02:48:02
asal
1106 orang telah melayarinya

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan