EmberJS - 使用“asyn / await”清除运行循环,而不是使用“then”

时间:2016-05-29 08:57:17

标签: testing ember.js async-await ember-data

我在测试中运行循环有一个奇怪的行为(是的,对于每个人都很难;-))和babel插件异步到生成器转换。

首先,我有“旧学校代码”:

await Ember.run(function() {
  return task.save().then(() => {
    subtask_1 = task.create_subtask();
    return subtask_1.save();
  }).then(() => {
    subtask_2 = task.create_subtask();
    return subtask_2.save();
  }).then(() => {
    subtask_3 = task.create_subtask();
    return subtask_3.save();
  }).then(() => {
    subtask_4 = task.create_subtask();
    return subtask_4.save();
  }).then(() => {
    return subtask_4.promise_priorize_before(subtask_2);
  });
});

有效。 ; - )

但是,如果我尝试过,我认为使用“新方式”的等效代码,我有一个错误:

await Ember.run(async function() {
  console.log(Ember.run.currentRunLoop);
  await task.save();
  console.log(Ember.run.currentRunLoop);

  subtask_1 = task.create_subtask();
  console.log(Ember.run.currentRunLoop);
  await subtask_1.save();
  console.log(Ember.run.currentRunLoop); // <---- null here

  subtask_2 = task.create_subtask();     // <---- crash here
  console.log(Ember.run.currentRunLoop);
  await subtask_2.save();

  subtask_3 = task.create_subtask();
  await subtask_3.save();

  subtask_4 = task.create_subtask();
  await subtask_4.save();

  return subtask_4.promise_priorize_before(subtask_2);
});

我不明白为什么,但是在简单地“保存”Ember数据后,当前的运行循环被清除。

错误是“断言失败:您已打开测试模式,...运行中具有异步副作用的任何代码”,因为Ember.run.currentRunLoop为空。

有你的想法吗?

弗雷德里克

[回应的开始]

我开始明白这个问题。许多Ember方法在调用时都没有开始工作。他们只安排工作!

//                           ┌──────────────────────────────┐                              
//                           │  ┌────────────────────────┐  │                              
//                           │  │         BEGIN          │  │                              
//                           │  └────────────────────────┘  │                              
//                           │                              │                              
//                           │                              │                              
//                           │                              │ 1: schedule                  
// ┌──────────────────┐   2  │  ┌────────────────────────┐  │    save      ┌─┬─┬─┬─┬─┬─┐   
// │ returned PROMISE │◀─────┼──│          SAVE          │──┼─────────────▶│ │ │ │ │ │ │──┐
// └──────────────────┘      │  └────────────────────────┘  │              └─┴─┴─┴─┴─┴─┘  │
//           ▲               │                              │                             │
//                           │                              │                             │
//           │               │                              │                             │
//                           │  ┌────────────────────────┐  │                             │
//           └ ─ ─ ─ ─ ─ ─ ─ ┼ ─│          END           │◀─┼─────────────────────────────┘
//              5: resolve   │  └────────────────────────┘  │          3: flush            
//              the promise  └──────────────────────────────┘           queues             
//                                     4: call the                                         
//                                   adapter for the                                       
//                                        save                                             
//                                                                                         
//                                    6: clear the                                         
//                                     current run                                         
//                                        loop                                             

因此,当我使用“then()”时,它是返回的promise的一部分,因此,在解决了save之后,预定的promise没有完成,但仅在最后一个“then()”之后。因此,当前的运行循环不会被清除。

但是为什么当我使用generator async / await时,它不是一回事?

为什么Ember文档没有显示方法何时安排其工作?

0 个答案:

没有答案