【发布时间】:2021-08-02 00:02:44
【问题描述】:
我希望实现一个作业队列,以确保 API 的响应按输入的输入项的顺序返回,即使每个 API 调用都可能花费可变的时间。
在此处查看代码框 https://codesandbox.io/s/sequential-api-response-eopue - 当我在输入字段中输入 item(例如 1、12、1234、12345)并按 Enter 键时,它会转到模拟后端,我将 item+-response 返回到表示相应输入的输出。但是,我使用Math.random() 对每个调用使用了不同的超时来模拟 API 可能需要不确定的时间量的真实场景。
电流输出
processing: 1
processing: 12
processing: 123
processing: 1234
processing: 12345
processing: 123456
response: 1234-response
response: 12-response
response: 123456-response
response: 123-response
response: 1-response
response: 12345-response
预期输出 我想看到的输出是
processing: 1
processing: 12
processing: 123
processing: 1234
processing: 12345
processing: 123456
response: 1-response
response: 12-response
response: 123-response
response: 1234-response
response: 12345-response
response: 123456-response
我的尝试:
我试图实现函数getSequentialResponse(它是函数getNonSequentialResponse 的包装器,会生成上面的错误输出)。此函数将用户输入的item 添加到queue 中,并且仅当getNonSequentialResponse 释放锁定变量_isBusy 时才执行queue.shift(),表明当前promise 已解决并准备好处理下一个promise。在此之前,它会在处理当前项目时在while 循环中等待。我的想法是,由于元素总是从头部移除,因此项目将按照输入的顺序进行处理。
错误: 但是,据我了解,这是错误的方法,因为 UI 线程正在等待并导致错误 Potential infinite loop: exceeded 10001 迭代。您可以通过创建一个 sandbox.config.json 文件来禁用此检查。
【问题讨论】:
标签: asynchronous web-worker job-queue