javascript - 取消之前的 promise

标签 javascript reactjs promise cancellation

我正在我的 React 应用程序中实现搜索输入,根据结果集的大小,服务器可能需要几秒钟的时间才能做出响应。我现在遇到的问题是,如果用户搜索具有较大结果集的术语,然后立即搜索具有较小结果集的术语,则第一个搜索将在最后一个搜索后返回并覆盖数据,因此在表格上显示不正确的结果。

目前我有一个搜索组件,它在其父组件中调用异步函数(可以从多个子组件调用该函数,搜索就是其中之一)。在异步函数内部,我使用搜索查询对服务进行了等待调用。一旦返回,结果就会传递给更新某些状态的函数。

我读过有关取消 token 的内容,但我不完全确定如何实现这一点。当搜索组件进行初始调用时,将有一个待处理的 promise ,直到收到结果为止。当我再次搜索时,我怎么能忽略第一个 Promise 的结果呢?每次搜索时,我是否会将 promise 存储在组件的字段中,并以某种方式在将来的搜索中检查该字段?

我在网上阅读了许多可能的解决方案。我使用 fetch-retry 来处理 API 调用,并且不想使用 bluebirdaxios 等库。我不明白的主要部分是,如果将来创建了一个 promise ,如何让我的 promise 无法解决。

希望我解释得足够好!

谢谢

最佳答案

When I search again, how would I be able to ignore the result of the first promise?

您可能不希望这样,因为如果您发出请求并忽略其结果,您就会浪费一些带宽。相反,您应该取消底层请求(不是 promise , promise 不能直接取消)。

为此,您可以为每次搜索保留一个堕胎 Controller :

 this.controller = new AbortController();

然后启动所有获取请求:

 fetch(url, { signal: this.controller.signal })
   .then(res => res.json())
   .then(res => this.setState({ /*...*/ }))
   .catch(() => /*..*/)

现在,如果您重新启动搜索,只需执行以下操作:

 this.controller.abort();
 this.controller = new AbortController();

然后再次进行抓取。

Read on

关于javascript - 取消之前的 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54448875/

相关文章:

reactjs - 使用 React Redux 显示 Snackbar

javascript - 光标跳出自定义文本字段上的文本字段!如何解决这个问题? [ Material -UI/TextField]

scala - 阿卡 Actor : ask pattern vs Promise

javascript - Bluebird promise : why it doesn't timeout?

javascript - 运行 'npm start' 时出现 Node JS 错误,可能是 KrakenJS?

javascript - 如何抑制 jsHint 消息说 app 从未在我的 AngularJS 应用程序中使用?

javascript - D3.js 方法链接命令在我拆分它时不起作用,它起作用

jquery - 使用 CORS 响应 jQuery 请求时缺少 header

javascript - 使用 reduce 串行链接 Javascript promise 时的范围问题

javascript - JSON 结构中的映射依赖关系