首頁  >  文章  >  web前端  >  為什麼在 Promise 鏈中使用 setTimeout 會導致 JSON 解析錯誤?

為什麼在 Promise 鏈中使用 setTimeout 會導致 JSON 解析錯誤?

Susan Sarandon
Susan Sarandon原創
2024-10-30 05:49:28398瀏覽

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

在Promise 鏈上使用setTimeout

在嘗試探索Promise 時,您嘗試使用初始請求獲取一組連結並獲取連結的內容使用後續請求的第一個連結。為了在返回下一個 Promise 物件之前引入延遲,您使用了 setTimeout。然而,這種方法遇到了一個 JSON 解析錯誤,當 setTimeout() 被消除後,該錯誤就會消失。

為了闡明這個錯誤,重要的是要理解,為了保持 Promise 鏈的連續性,你不能像這樣使用 setTimeout()你做到了。原因是,您沒有從 .then() 處理程序返回承諾,而是從 setTimeout() 回調返回承諾,這會使您的努力無效。

相反,請考慮實作一個簡單的延遲函數:

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

使用此延遲函數,您可以如下修改程式碼:

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

此修改可確保您從.then() 處理程序返回一個承諾,

或者,您可以使用延遲方法擴展Promise 對象,從而允許您採用更簡潔的語法:

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

通過合併這些修改,您可以無縫地在您的承諾鏈中引入延遲,減輕遇到的JSON 解析錯誤。

以上是為什麼在 Promise 鏈中使用 setTimeout 會導致 JSON 解析錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn