使用 Flux 的乐观更新(异步)
Optimistic Updates Using Flux (async)
我正在尝试向我的 Flux 模型添加乐观更新。我正在将 UI 动作分派和服务器动作分派合并为一个动作。我在 action creator 中的代码如下所示:
deleteItem: function(itemId) {
// optimistic update
WebshipDispatcher.handleServerAction({
type: ActionTypes.DELETE_ITEM,
deleteStatus: 'success',
itemId: itemId
});
// now let's actually check if that was the correct result
AppAjaxUtil.get('/deleteItem', {itemId: itemId}, function(result) {
WebshipDispatcher.handleServerAction({
type: ActionTypes.DELETE_ITEM,
deleteStatus: result.status, // 'success' or 'failure'
itemId: itemId
});
}, function(error) {
WebshipDispatcher.handleServerAction({
type: ActionTypes.DELETE_ITEM,
error: error
});
});
}
这是允许乐观更新的适当方式还是我对这篇文章的思考不正确?
@fisherwebdev 是对的。真正的逻辑会发生在您的商店中。例如,当项目确实无法删除时,您将如何处理逻辑?它自己变成了野兽。除非您得到服务器的确认,否则您真的不想从您的商店中删除该项目。像 Ext 这样的库在等待服务器成功响应时将记录标记为脏。所以更新仍然是乐观的,但是如果服务器出现故障,用户和记录会得到通知。
因此,您可以在商店中收集 dirty
条记录,当您的服务器响应成功时,这些记录将被删除。这很粗糙,但类似于以下内容:
deleteItem: function(itemId) {
// optimistic update
WebshipDispatcher.handleServerAction({
type: ActionTypes.MARK_ITEM_AS_DIRTY,
deleteStatus: 'success',
itemId: itemId
});
// now let's actually check if that was the correct result
AppAjaxUtil.get('/deleteItem', {itemId: itemId}, function(result) {
WebshipDispatcher.handleServerAction({
type: result.status ? ActionTypes.DELETE_ITEM : ActionTypes.DELETE_ITEM_FAIL,
deleteStatus: result.status, // 'success' or 'failure'
itemId: itemId
});
}, function(error) {
WebshipDispatcher.handleServerAction({
type: ActionTypes.DELETE_ITEM_FAIL,
error: error,
itemId: itemId
});
});
}
所以基本上,如果您的响应成功,您就可以从您的商店中删除脏记录。否则,您会在您的商店中获得您的脏记录的参考,当您的应用程序仍然 运行 时,可以在幕后使用您的服务器重试。因此,从本质上讲,您的用户不必坐下来等待响应。
我正在尝试向我的 Flux 模型添加乐观更新。我正在将 UI 动作分派和服务器动作分派合并为一个动作。我在 action creator 中的代码如下所示:
deleteItem: function(itemId) {
// optimistic update
WebshipDispatcher.handleServerAction({
type: ActionTypes.DELETE_ITEM,
deleteStatus: 'success',
itemId: itemId
});
// now let's actually check if that was the correct result
AppAjaxUtil.get('/deleteItem', {itemId: itemId}, function(result) {
WebshipDispatcher.handleServerAction({
type: ActionTypes.DELETE_ITEM,
deleteStatus: result.status, // 'success' or 'failure'
itemId: itemId
});
}, function(error) {
WebshipDispatcher.handleServerAction({
type: ActionTypes.DELETE_ITEM,
error: error
});
});
}
这是允许乐观更新的适当方式还是我对这篇文章的思考不正确?
@fisherwebdev 是对的。真正的逻辑会发生在您的商店中。例如,当项目确实无法删除时,您将如何处理逻辑?它自己变成了野兽。除非您得到服务器的确认,否则您真的不想从您的商店中删除该项目。像 Ext 这样的库在等待服务器成功响应时将记录标记为脏。所以更新仍然是乐观的,但是如果服务器出现故障,用户和记录会得到通知。
因此,您可以在商店中收集 dirty
条记录,当您的服务器响应成功时,这些记录将被删除。这很粗糙,但类似于以下内容:
deleteItem: function(itemId) {
// optimistic update
WebshipDispatcher.handleServerAction({
type: ActionTypes.MARK_ITEM_AS_DIRTY,
deleteStatus: 'success',
itemId: itemId
});
// now let's actually check if that was the correct result
AppAjaxUtil.get('/deleteItem', {itemId: itemId}, function(result) {
WebshipDispatcher.handleServerAction({
type: result.status ? ActionTypes.DELETE_ITEM : ActionTypes.DELETE_ITEM_FAIL,
deleteStatus: result.status, // 'success' or 'failure'
itemId: itemId
});
}, function(error) {
WebshipDispatcher.handleServerAction({
type: ActionTypes.DELETE_ITEM_FAIL,
error: error,
itemId: itemId
});
});
}
所以基本上,如果您的响应成功,您就可以从您的商店中删除脏记录。否则,您会在您的商店中获得您的脏记录的参考,当您的应用程序仍然 运行 时,可以在幕后使用您的服务器重试。因此,从本质上讲,您的用户不必坐下来等待响应。