javascript - 当卸载/重用 React 组件时,如何取消 Promise 中的下一个 'then'?

标签 javascript reactjs ecmascript-6 promise

我试图在卸载/重新使用 React 组件时取消 promise 。现在我正面临一个问题,我可以在下面的小图中更好地解释:

** Promise 必须完成(执行 AJAX 请求并相应地更新 redux 存储)

组件已创建 => 已安装 => _onClick() 已触发 => Promise 开始 => 组件已卸载但被回收 => Promise 已完成 => 在回收的组件中调用 setState() 并使用先前的错误状态重新呈现组件。

如何取消/中断/停止下一个“then”但仍执行 Promise?

...
    _onClick() {
        let dispatch = this.props.dispatch;

        if (!this.state.on) {
            API.On(dispatch, this.props.id).then(() => {
                this.setState({
                    on: true,
                })
            }).catch((error) => {
                this.setState({
                    on: false,
                })
            });
        } else {
            API.Off(dispatch, this.props.id).then(() => {
                this.setState({
                    on: false,
                });
            }).catch((error) => {
                this.setState({
                    on: true,
                })
            })
        }
    }
...

最佳答案

我在这里要做的只是向设置状态的 promise 主体添加一个条件。您可以使用 React 的生命周期 Hook 来跟踪元素当前是否在 DOM 中。

这是一个跟踪组件是否已安装的快速示例:

class Test extends React.Component {
  render() {
    return (<p>hello</p>);
  }

  componentDidMount () {
    this.mounted = true
    console.log(`mounted: ${this.mounted}`)
  }

  componentWillUnmount () {
    this.mounted = false
    console.log(`mounted: ${this.mounted}`)
  }
}

实例:https://codepen.io/jenius/pen/MmjPJV


基于此,您应该能够在 promise 处理程序中添加一个简单的 if/else 来解决您的问题!

关于javascript - 当卸载/重用 React 组件时,如何取消 Promise 中的下一个 'then'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43598979/

相关文章:

javascript - 使用 javascript 验证日期时间输入

javascript - 如何通过 ExtJS 动态加载和使用 vanilla/jQuery 库

javascript - 接收错误 - 实现 React Spring 基本示例时,只能在函数组件的主体内部调用 Hook

javascript - 将 props 传递给 React 组件中的 componentDidMount()

reactjs - 如何重写@devexpress/dx-react-grid-material-ui的样式?

javascript - 类表达式构造函数

javascript - 如何将参数传递给一个传递的函数? (ES6)

javascript - Syncfusion 无法从数据源呈现网格行模板表达式值

javascript - 我需要更改 y 轴的计算。那么,如何使用 mapboxgl js API 自定义此轴?

javascript - 通过迭代数组将方法分配给对象