Mengapakah Menggunakan `setTimeout` dalam Rantaian Janji Menyebabkan Ralat Penghuraian JSON?

Susan Sarandon
Lepaskan: 2024-10-30 05:49:28
asal
465 orang telah melayarinya

Why Does Using `setTimeout` in a Promise Chain Cause a JSON Parsing Error?

Menggunakan setTimeout on Promise Chain

Dalam percubaan untuk meneroka janji, anda telah cuba untuk mengambil satu set pautan menggunakan permintaan awal dan mengambil kandungan pautan pertama menggunakan permintaan seterusnya. Untuk memperkenalkan kelewatan sebelum mengembalikan objek janji seterusnya, anda telah menggunakan setTimeout. Walau bagaimanapun, pendekatan ini menghadapi ralat penghuraian JSON yang hilang apabila setTimeout() dihapuskan.

Untuk menjelaskan ralat ini, adalah penting untuk memahami bahawa untuk mengekalkan kesinambungan rantai janji, anda tidak boleh menggunakan setTimeout() sebagai awak buat. Sebabnya, anda tidak memulangkan janji daripada pengendali .then(), tetapi daripada panggilan balik setTimeout(), yang menjadikan usaha anda tidak berkesan.

Sebaliknya, pertimbangkan untuk melaksanakan fungsi kelewatan yang mudah:

<code class="js">function delay(t, val) {
    return new Promise(resolve => setTimeout(resolve, t, val));
}</code>
Salin selepas log masuk

Dengan adanya fungsi kelewatan ini, anda boleh mengubah suai kod anda seperti berikut:

<code class="js">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

Pengubahsuaian ini memastikan anda mengembalikan janji daripada pengendali .then(), dengan itu merantainya dengan sewajarnya.

Sebagai alternatif, anda boleh melanjutkan objek Promise dengan kaedah kelewatan, membolehkan anda menggunakan sintaks yang lebih ringkas:

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

Promise.resolve("hello").delay(500).then(function(val) {
    console.log(val);
});</code>
Salin selepas log masuk

Dengan memasukkan pengubahsuaian ini, anda boleh dengan lancar memperkenalkan kelewatan dalam rantai janji anda, mengurangkan ralat penghuraian JSON yang dihadapi.

Atas ialah kandungan terperinci Mengapakah Menggunakan `setTimeout` dalam Rantaian Janji Menyebabkan Ralat Penghuraian JSON?. 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