注意:这是https://stackoverflow.com/questions/32536037/flux-store-collection-by-criteria-vs-single-item的后续问题,但理解和回答是独立的。
想象一下,我们有一个管理(CRUD)任务的应用程序。一个操作是任务编辑。
首先,编辑视图使用动作创建程序加载任务,该动作创建程序从服务器异步获取它,并将TASK_LOAD_SUCCESS事件与任务有效负载一起分派。接下来,任务存储库存储任务并发出更改事件,以便编辑视图可以读取它并填写表单。
当用户提交表单时,应保存更改并关闭编辑视图。
在提交时,编辑视图告诉操作创建者以异步方式保存任务。在AJAX成功时,将调度TASK_SAVE_SUCCESS(到任务存储区)。
Q1:Task Store应该做什么?它是否应更新其内部标志已保存任务然后发出更改事件,然后视图应从存储中读取该标志并在其为真时关闭它?
Q2:商店是否应该在之前加载的任务集合中找到任务并在那里更新?集合中的其他任务将保持陈旧(请参阅https://stackoverflow.com/questions/32536037/flux-store-collection-by-criteria-vs-single-item中的Q2)。
问题3:如果我们再次编辑任务怎么办? Store仍然具有Task已成功保存的标志,并立即关闭。但它来自之前的保存。怎么处理呢?
如果我们想要删除任务,就会出现Simmilar问题。我们使用乐观锁定,因此我们必须首先从服务器读取任务然后显示确认对话框,最后删除服务器上的任务(从第一次读取时提供ETag)。
问题4:如何使用商店表示已加载任务以进行删除?在这个AJAX调用期间,可能会有另一个异步读取操作完成,它会与此冲突。是否应该有一个单独的商店删除任务?
问题5:这与Q1相同。删除后如何告诉视图已完成,以便关闭确认对话框?
答案 0 :(得分:0)
Q1-Q3:您可以在TaskStore中存储edit_timestamp
并在open_timestamp
中存储确认对话框。在emitChange
,您可以比较edit_timestamp > open_timestamp
。
问题4:您可以在获取请求中为每个taskId缓存请求Promise。因此,两次执行相同的请求(对同一taskId读取/删除fetch),您可以订阅现有的Promise。这允许你只保留单个任务实例,我希望避免Q5问题:
//To imagine how to arrange promise-based async interaction you may look here http://mjw56.github.io/handling-asynchronous-data-flow-in-flux/index.html
var promises = {};
//Returns Promise
var asyncGetCall = function(taskId) {...}
var getTaskForDelete, getTaskForRead;
getTaskForDelete = getTaskForRead = function(taskId) {
if (!promises[taskId]) {
promises[taskId] = asyncGetCall(taskId);
}
return promises[taskId];
}
getTaskForDelete(10).then(function() {...}); //do asyncGetCall
getTaskForRead(10).then(function() {...}); // do nothing, wait for the first req results