我在测试中运行循环有一个奇怪的行为(是的,对于每个人都很难;-))和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文档没有显示方法何时安排其工作?