首页 > 解决方案 > 升级到 ember 3.15 后,产生承诺的助手将无限重新计算

问题描述

我无法解决这个错误,但是当我从 3.13 升级到 3.15 时发生了一些事情。在某些(但不是全部)模板中,我在 let 块中使用助手的结果,助手将被无限重新渲染。

{{#let (data-fetch-task @theThing) as |data|}}

  {{await data}}

{{/let}}

如果我不对数据做任何事情,那很好。一旦我尝试将数据用于任何事情,它就会爆炸。具体来说,我有关于 Promise 和并发任务的麻烦示例。它们非常融入我的框架,因此很难一次将它们分解出来。我将不得不为此努力。

我已经看到了过去由于以下错误而发生这种情况的示例:

https://github.com/emberjs/ember.js/issues/14351

我还阅读了有关修改助手参数从而导致重新渲染的助手。但我很确定我检查得很好,这不是问题。

浏览器会慢到爬行,如果我将 console.log('hi') 语句放在助手的计算函数中,我会看到数千个'hi'。所以我知道它被一遍又一遍地调用

我知道这不是一个非常完整的问题,但我现在陷入困境,这是我能找到的最好的。

在我的应用程序的辛烷化过程中是否会发生任何可能导致这种情况发生的事情?

编辑---更多信息

这是我的助手的基本版本,被一遍又一遍地调用。“field”是一个保存模型信息的 EmberObject - 在这种情况下是字段的可用值。

import Helper from '@ember/component/helper';
import { inject as service } from '@ember/service';

export default class AvailableValsHelper extends Helper  {
  @service store;

  compute([field]){
    console.log("started");
    return field.availableValues(this.store);
  }
}

可用值是

(store) => store.findAll('product-types');

逻辑是对的。如果我把它放在一个计算属性中它工作正常。

帮助器在这样的模板中使用:

    {{#let (available-vals @field) as |opts|}}
      {{log opts}}
    {{/let}}

如果我省略了日志,它可以正常工作,但实际上并没有被调用,所以......那又怎样:-/

我尝试将帮助程序设为函数而不是类,并且尝试将“存储”的范围更改为具有相同结果的组件。我一直在堆栈中确保@'s 和 this's 等也是正确的,以防它是名称/范围混淆的问题。如果它吞下了一个错误,那么我不知道为什么它会作为组件上的 cp 工作 - 显然这是另一种失败模式。

而这只是一个帮手。我有另一个返回任务,它正在做同样的事情。尽管我使用了几乎所有的设计模式,但我从未选择过任何 Octane 行为:尖括号语法、本机类、异步/等待等。我在 3.13 上,当我转到 3.15 时,这弹出了。就像我说的,如果我将帮助程序输出定义为组件上的 cp,那么它可以工作,所以这就是“解决方法”。我不禁觉得我偶然发现了一些奇怪的失败模式,或者我的配置被抬高了,其中一些包装器正在“辛烷值方式”和其他“旧方式”中做事。

有一次我在控制台中看到来自“存储”的不同跟踪,它说在调用 findAll 期间超出了最大堆栈级别。它确实导致我对我的机器进行了硬重置,所以我无法保存它。我应该用手机拍张照片的。有一句关于“可追踪”的说法。我不记得它说了什么。但是看着它让我想知道是否因为对“store”的引用是一个闭包,它是否试图跟踪对没有值上下文的值的更改。我对所有这些是如何工作的并不是很熟悉,但是当我认为我所做的只是一个非常简单的方法应用程序时,我觉得看到那个调用很奇怪。

标签: ember.jsember-octaneember-concurrency

解决方案


推荐阅读