在尝试探索 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中文网其他相关文章!