在 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中文網其他相關文章!