首頁 >web前端 >js教程 >為什麼在 Promise 鏈中使用 setTimeout() 會導致 JSON 解析錯誤?

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

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-01 12:53:29679瀏覽

Why does using setTimeout() inside a promise chain lead to a JSON parsing error?

在 Promise 鏈中使用 setTimeout()

使用 Promise 時,了解如何正確處理非同步操作非常重要。一個常見問題是嘗試在承諾鏈中使用 setTimeout()。

在提供的程式碼片段中,目標是獲取一組鏈接,然後獲取第一個鏈接的內容。但是,setTimeout() 呼叫用於在返回下一個 Promise 物件之前引入延遲。這會導致 JSON 解析錯誤。

為什麼會失敗?

在 Promise 鏈之外使用 setTimeout() 會阻止 Promise 鏈繼續運作。在這種情況下,setTimeout()回呼傳回一個promise,但它沒有連結到前一個promise。因此,後續的鏈操作不會被執行。

解決方案

為了保持 Promise 鏈完整,您必須從 .then() 處理程序返回 Promise。 setTimeout() 函數應包裝在新的 Promise 中,確保 Promise 鏈得到維護。

範例

將setTimeout() 呼叫替換為以下程式碼:

<code class="js">return delay(1000).then(() => {
   return getLinks(globalObj["two"] + ".txt");
});</code>

延遲函數將setTimeout() 呼叫包裝在一個Promise 包裝中,允許它連結到前一個Promise。

或者,您可以延遲擴展 Promise 物件方法:

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

這允許您直接在 Promise 上使用 .delay(x):

<code class="js">getLinks('links.txt')
   .then((links) => {
      return getLinks(globalObj["one"] + ".txt");
   })
   .then((topic) => {
      return Promise.resolve(topic).delay(1000);
   })
   .then((topic) => {
      return getLinks(globalObj["two"] + ".txt");
   });</code>

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

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