【问题标题】:Is 'incrementProperty' an async call?'incrementProperty' 是异步调用吗?
【发布时间】:2018-01-13 15:50:00
【问题描述】:

查看Ember tutorial on testing models,它将incrementProperty 视为异步调用。为什么?

app/models/player.js

import Model from 'ember-data/model';
import { attr } from 'ember-data/model';

export default Model.extend({
  level: attr('number', { defaultValue: 0 }),
  levelName: attr('string', { defaultValue: 'Noob' }),

  levelUp() {
    let newLevel = this.incrementProperty('level');
    if (newLevel === 5) {
      this.set('levelName', 'Professional');
    }
  }
});

tests/unit/models/player-test.js

import { moduleForModel, test } from 'ember-qunit';
import { run } from "@ember/runloop";

moduleForModel('player', 'Unit | Model | player', {
  // Specify the other units that are required for this test.
  needs: []
});

test('should increment level when told to', function(assert) {
  // this.subject aliases the createRecord method on the model
  const player = this.subject({ level: 4 });

  // wrap asynchronous call in run loop
  run(() => player.levelUp());

  assert.equal(player.get('level'), 5, 'level gets incremented');
  assert.equal(player.get('levelName'), 'Professional', 'new level is called professional');
});

据我所知,code 似乎是同步的,但从测试中删除运行循环确实会产生错误并且测试失败:

错误:断言失败:您已打开测试模式,该模式 禁用运行循环的自动运行。您将需要包装任何代码 运行中的异步副作用

【问题讨论】:

    标签: ember.js


    【解决方案1】:

    引用Run Loop guides,操作被批处理以优化渲染:

    Ember 的内部结构和您将在应用程序中编写的大部分代码都发生在运行循环中。运行循环用于以最有效和最高效的方式对工作进行批处理和排序(或重新排序)。

    为什么运行循环很有用? 很多时候,批处理类似的工作是有好处的。 Web 浏览器通过对 DOM 进行批量更改来做一些非常相似的事情。

    测试中发生的情况是 runloop 不会自动运行,因此您需要 run 来刷新队列。我相信正在努力消除测试环境的这种不同行为。

    【讨论】:

    • 嗯 - 我理解,这对于异步操作是有意义的,但是,是什么让 this 特定示例异步?可以说,该示例是进行 AJAX 调用;那么这很简单。但是指南中的这个特殊示例让我仍然摸不着头脑,想知道异步调用来自何处。升级?增量属性?放?它们不都是同步的吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多