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>
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>
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>
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!