【发布时间】:2019-11-26 04:47:32
【问题描述】:
以下是我的场景,其中我使用搜索关键字访问搜索 API,但由于时间不均,它占用的 UI 没有正确更新。
场景-
- 我在输入框中输入
a,搜索请求就像-search/?q=a解决问题的时间是5sec。 - 我继续输入,现在查询字符串类似于 -
ab,所以另一个查询类似于 -search/?q=ab并假设它需要4sec的时间才能得到解决。 - 我继续输入,现在查询字符串是
abc,所以另一个查询类似于 -search/?q=abc并假设解决它需要时间是3sec。
所以在这里你可以看到 - 请求 1 在 5 秒内获取数据,2 在 4 秒内获取数据,在 3 秒内获取数据,所以在 UI 中结果类似于 -
a => /?q=a (5s)
ab => /?q=ab (4s)
abc => /?q=abc (3s)
UI 中的结果 -
=> Result of abc
=> Result of abb
=> Result of a
但正确的顺序应该是——
=> Result of a
=> Result of ab
=> Result of abc
我的尝试 -
- 我试过
Promise.all。问题是它只会在 12 秒(5+4+3 秒)后更新 UI。 - 我试过
Promise.allSettled(),但问题是我存储承诺的数组是动态的,所以我不确定这是否可以增强。
我相信这不是极端情况,人们可能已经面对它。让我知道我还能尝试什么。
仅供参考 - 我还阅读了有关 AbortController 的信息,但明确提到它是一种实验性技术,所以我在使用它时有点犹豫。
【问题讨论】:
-
一种简单的方法是让您的搜索按您想要的任何顺序进行,但在搜索响应中包含搜索请求,并且只显示与当前值匹配的响应。在您的场景中,a 和 ab 搜索的结果将被简单地忽略。其他线索是延迟搜索,以便在用户输入时取消无用的调用(使用 debounce,与 promise 具有相同的支持)。
-
如果你要找的是订单,你要
Promise.each或async/await -
通常您会保留对上次发出的请求的引用。当新的搜索出现时,取消现有请求,因为您不再需要该响应。然后发出下一个请求。另见stackoverflow.com/a/37492399/1260204
标签: javascript reactjs ecmascript-6 promise fetch