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