You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ember控制器中RSVP.allSettled执行后如何保存错误状态并更新控制器

解决Ember控制器中RSVP.allSettled后收集错误并更新DOM的问题

问题根源

你碰到的this未定义问题,是因为then回调用了传统function,它的this指向回调自身的执行上下文,而非控制器实例。另外直接用push修改@tracked数组,Ember可能无法触发响应式更新,导致DOM不刷新。

修复方案

1. 修正this指向

把then里的传统函数换成箭头函数,箭头函数会继承外层作用域的this(也就是当前控制器实例)。

2. 正确更新响应式数组

@tracked对数组的原地修改(比如push)不会自动触发重渲染,需要通过替换整个数组的方式触发响应式更新。

修正后的完整代码

export default class SomeController extends Controller {
  @tracked errorlist = [];

  @action
  someAction() { // 补全原代码缺失的括号
    RSVP.allSettled(promises).then((retarray) => { // 替换为箭头函数
      // 批量筛选并收集错误
      const newErrors = retarray
        .filter(retstate => retstate.state === 'rejected')
        .map(retstate => retstate.reason);

      // 替换数组触发响应式更新
      this.errorlist = [...this.errorlist, ...newErrors];
    });
  }
}

额外可选写法

如果习惯用传统函数,也可以提前在action里保存控制器的引用:

@action
someAction() {
  const controller = this; // 保存控制器实例
  RSVP.allSettled(promises).then(function(retarray) {
    retarray.forEach(retstate => {
      if (retstate.state === 'rejected') {
        controller.errorlist = [...controller.errorlist, retstate.reason];
      }
    });
  });
}

注意:原代码里prommises是拼写错误,要改成promises;用filter+map批量收集错误比forEach更简洁易维护。

内容的提问来源于stack exchange,提问作者s.w

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 03:32:02