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