我正在使用alt作为我的项目的通量实现,并且无法围绕处理两个相关实体的加载存储的最佳方法来解决问题。我正在使用源功能和 registerAsync 来处理我的异步/api 调用并使用 AltContainer 将它们绑定到我的视图。
我有两个实体通过对话 ID 一一关联。两者都是通过 api 调用加载的:
一旦我的作业存储加载了数据,我想填充一个对话存储。
我使用源加载作业存储:
module.exports = {
fetchJobs() {
return {
remote() {
return axios.get('api/platform/jobs');
},....
看起来像是waitFor()方法的工作,但是当一个商店的内容需要转换或与另一个商店的内容合并时,它似乎可以使用。我需要根据另一个数据存储的内容获取一个数据存储的内容。
一般来说,我需要:
- 调用第三方 API 并将实体列表加载到商店中。
- 当该数据到达时,我需要使用上述每个属性来调用另一个 API 并将该数据加载到另一个存储中。
我天真的解决方案是从作业存储中引用对话操作并在数据到达时调度事件。像这样的东西:
var jobActions = require('../actions/Jobs');
var conversationActions = require('../actions/Conversations');
class JobStore {
constructor() {
this.bindListeners({
handlefullUpdate: actions.success
});...
}
handlefullUpdate(jobs) {
this.jobs = jobs;
conversationActions.fetch.defer(jobs);
}
}
当然,这样做违反了商店不应该分派事件的格言,所以我必须使用 defer 在分派过程中分派一个动作。这对我来说很有意义,因为沿着这条路走下去,我似乎在我的代码中重新引入了各种副作用;失去了我应该看到的“功能管道”的美感。
此外,我的作业存储必须持有对任何依赖实体的引用,以便它可以调度适当的操作。这里我只有一个,但我可以想象很多。就实体之间的依赖关系而言,这似乎完全倒退。
想到了几个替代方案:
我可以在获取所有对话的源/操作中调用api/platform/jobs端点,以获取 ID。原来的方法更有效,但这似乎更符合通量的精神,因为我失去了所有的串扰。
我也可以有一个动作/源来获取两者,返回{jobs:{}, conversations: in the action}
(使用Promise在那里编排依赖项)并使用它填充两个商店。但是这种方法对我来说似乎不必要地复杂(我觉得我不应该这样做!)。
但我错过了另一种方式吗?这样一个常见的用例会打破通量范式的优雅和/或迫使我跳过这么多圈子,这似乎很奇怪。
@dougajmcdonald在这里提出了一个类似的问题,但可能措辞过于笼统,并没有引起任何关注: