如何在Ember.js中迭代保存子记录?

时间:2019-07-11 15:41:32

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

我想使用Ember Data将父记录和多个子记录保存到外部REST API。我的问题是我不确定异步处理此问题的最佳方法。

我的第一次尝试看起来像这样:

function repeatedString(s, n) {
  var r = n % s.length,
    m = (n - r) / s.length,
    count = 0;

  for (var i = 0; i < s.length; ++i) {
    if (s[i] === "a") {
      count += m + (i < r);
    }
  }
  return count;
}

console.log(repeatedString("abcac", 1234567890));

这将成功创建父级和所有子级,但是无法将所有子级的ID保存在父级记录中。在调用parent.save()时,并非所有child.save()承诺都已解决。

我了解到RSVP是可以用来解决此问题的库,但是我找不到任何与我要执行的操作相关的使用示例。

有人能概述一下我该如何重做以确保在尝试保存父级之前已保存所有子级吗?

1 个答案:

答案 0 :(得分:1)

Ola @Bean,谢谢您的提问?

正如@jelhan在评论中所问的那样,此问题的答案实际上取决于您的API可以支持的内容?我将通过一些假设和概括来回答您的问题,但希望它将很有用!

首先让我们明确一些内容,我将为“父级”和“子级”定义模型,以便我们知道其工作方式。

// app/models/parent.js
import DS from 'ember-data';
const { Model, attr, hasMany } = DS;

export default Model.extend({
  name: attr(),
  children: hasMany('child'),
});
// app/models/child.js
import DS from 'ember-data';
const { Model, attr, belongsTo } = DS;

export default Model.extend({
  name: attr(),
  parent: belongsTo('parent'),
});

现在,我们拥有的模型将像您的示例一样设置一个父级和8个子级,但是在我的模型中,为了清楚起见,我将分开保存:

// create 1 parent
let parent = this.store.createRecord('parent', {
  name: 'Bob'
});

// create 8 children
let children = [];

for (i=0;i<8;i++) {
  let child = this.store.createRecord('child', {
    name: 'Child' + i
  });

  children.push(child);
}

所以现在您的商店中将有1个父母和8个孩子,但由于我们没有保存任何东西,因此没有网络请求。

您现在有2个选项(取决于您的后端支持什么)。您可以:

  • 先保存父母
  • 为每个孩子设置父母
  • 保存每个孩子

或者您可以:

  • 保存每个孩子
  • 将父级的children数组设置为子模型的集合
  • 保存父母

在一个示例中,我现在将介绍这两个选项。我正在使用async-await使它更易于阅读,因此请确保您正确使用它?

// Save parent first
await parent.save();

let promises = children.map((child) => {
  child.set('parent', parent);
  return child.save();
})

await Promise.all(promises);
// Save children first
let promises = children.map((child) => {
  return child.save();
})

await Promise.all(promises);

parent.set('children', children);

await parent.save();

由于ember-data的工作方式,它应该自动为您关联反向关系you如果您想了解有关此问题的更多信息,请查阅官方Ember文档https://guides.emberjs.com/release/models/relationships/#toc_explicit-inverses