我正在寻求实现一个作业队列,以确保即使每个 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
用户输入的内容添加到 aqueue
中,并且仅在释放queue.shift()
锁变量时执行,通过指示当前的承诺已解决并准备处理下一个承诺。在此之前,它会在处理当前项目时循环等待。我的想法是,由于元素总是从头部删除,因此项目将按照输入的顺序进行处理。_isBusy
getNonSequentialResponse
while
错误: 但是,据我了解,这是错误的方法,因为 UI 线程正在等待并导致错误潜在无限循环:超过 10001 次迭代。您可以通过创建一个 sandbox.config.json 文件来禁用此检查。