- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
有一个plenty的discussion关于如何在 Flux 中与外部服务通信。
很明显,基本工作流程是触发 HTTP 请求,最终将根据响应分派(dispatch)成功或失败的操作。您还可以选择在发出请求之前分派(dispatch)“进行中”操作。
但是如果请求的参数取决于商店的状态怎么办?似乎没有人提到它。
因此,本质上,根据用户与 View 的交互,调度一个 ACTION。 Store 拥有关于如何从当前 state0 转换到给定 ACTION 的下一个 state1 的逻辑。需要来自 state1 的数据才能正确形成新的 HTTP 请求。
例如,用户在页面上选择了新的过滤器,商店决定也重置分页。这应该会导致一个新的 HTTP 请求,其中包含(新过滤器值,第一页),而不是(新过滤器值,来自 state0 的当前页面)。
View 无法使 HTTP 调用本身与用户交互正确,因为它必须复制存储的逻辑才能转换到下一个状态。
View 无法在其存储的 onChange 处理程序中进行 HTTP 调用,因为此时它不再知道状态更改的来源。
这看起来是一个可行的选择,可以让商店在转换到下一个状态后在操作处理程序中触发 HTTP 请求。但这将使此操作隐式启动 HTTP 调用,从而无法获得用于调试的已调度操作的可重播日志。
Flux 中 HTTP 请求应该从哪里发起?
最佳答案
让我们从底部开始:
It looks like a viable option to make store fire the HTTP request in the action handler, after it transitioned to the next state. But this will make this action implicitly initiating HTTP call, which disables neat possibility to have a replayable log of dispatched actions for debugging.
如果您处于调试/重播模式,可以通过不发起 HTTP 请求来缓解此问题。只要您在 HTTP 请求处理程序中执行的唯一操作是触发操作(例如 SUCCESS
和 FAILURE
操作),此方法就非常有效。您可以使用简单的全局 bool 值 (if (!debug) { httpReq(...) }
) 来实现此目的,但您也可以使该模式更加正式。
在 Event Sourcing说法,你使用 Gateways出于此类目的。在正常操作中,网关会发出 HTTP 请求,而在调试过程中,您会关闭网关(因此它不会发出任何 HTTP 请求)。
也就是说,我认为这个问题实际上可以通过重新考虑 HTTP 请求的发出位置来解决。
So essentially, based on user interaction with the view, an ACTION is dispatched. Store owns logic on how to transition from current state0 to the next state1 given ACTION. Data from state1 is needed to properly form new HTTP request.
在您问题的第二个链接中( Where should ajax request be made in Flux app? ), I recommend在操作创建器中进行写入,但在商店中进行读取。如果您将该模式推断到您的用例中,您可能最终会得到类似这样的结果(为了清楚起见,使用伪代码和长变量名称):
class DataTable extends React.Component {
render() {
// Assuming that the store for the data table contains two sets of data:
// one for the filter selection and one for the pagination.
// I'll assume they're passed as props here; this also assumes that
// this component is somehow re-rendered when the store changes.
var filter = this.props.filter;
var start = this.props.start;
var end = this.props.end;
var data = this.props.dataTableStore.getDataForPageAndFilter(
start, end, filter
);
// the store will either give us the LOADING_TOKEN,
// which indicates that the data is still loading,
// or it will give us the loaded data
if (data === DataTableStore.LOADING_TOKEN) {
return this.renderLoading();
} else {
return this.renderData(data);
}
}
}
class DataTableStore {
constructor() {
this.cache = {};
this.filter = null;
this.start = 0;
this.end = 10;
}
getDataForPageAndFilter(start, end, filter) {
var url = HttpApiGateway.urlForPageAndFilter(start, end, filter);
// in a better implementation, the HttpApiGateway
// might do the caching automatically, rather than
// making the store keep the cache
if (!this.cache[url]) {
this.cache[url] = DataTableStore.LOADING_TOKEN;
HttpApiGateway.query(url)
.then((response) => {
// success
var payload = {
url: url,
data: response.body
};
dispatch(DATA_FETCH_SUCCESS, payload);
}, (error) => {
// error
dispatch(DATA_FETCH_FAIL, { ... });
});
}
return this.cache[url];
}
handleChangeFilterAction(action) {
this.filter = action.payload.filter;
// the store also decides to reset pagination
this.start = 0;
this.end = 10;
this.emit("change");
}
handleDataFetchSuccessAction(action) {
this.cache[action.payload.url] = data;
this.emit("change");
}
handleDataFetchFailAction(action) {
// ...
}
}
DataTableStore.LOADING_TOKEN = "LOADING"; // some unique value; Symbols work well
您可以看到,存储负责决定如何更新分页和过滤器变量,但不负责决定何时应发出 HTTP 请求。相反, View 只是请求一些数据,如果存储在缓存中没有这些数据,它将然后发出 HTTP 请求。
这还允许 View 将任何其他本地状态传递到 getter 中(以防 HTTP 请求也依赖于本地状态)。
关于reactjs - Flux中HTTP请求应该从哪里发起?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29875812/
我正在尝试构建一个应用程序 A(如适配器),它将: 1)接收带有某些 key (JSON格式)的POST请求 2) 它应该以某种方式修改该 key 并向另一个系统 B 创建 POST 请求。 3)应用
除了语义之外,是否有任何理由为 View 和服务器操作创建不同的调度方法?我见过的所有教程和示例(最值得注意的是 this )在监听已分派(dispatch)的有效负载时完全忽略源常量,以支持打开有效
我的密码 https://gist.github.com/ButuzGOL/707d1605f63eef55e4af 因此,当我收到登录成功回调时,我想进行重定向, 重定向也可以通过调度程序进行。 我
我试图找出使用 Flux 架构处理中型复杂应用程序中相当常见的情况的最佳方法是什么,当组成数据的模型之间存在依赖关系时如何从服务器检索数据。例如: 商店网络应用程序,具有以下模型: 购物车(用户可以拥
我有点坚持一项琐碎的任务:每当我使用响应式 spring WebClient 查询外部 API 或查询响应式 MongoDBRepository 时,我想记录有多少实体通过了我的通量,例如。记录消息,
我有这种情况。我有一个分页 API,它为我提供了过去 12 个月的数据。 API 的响应如下: public class PagedTransfersDto { private List cont
我有两个 Flux,一个用于成功元素,另一个用于保存错误元素 Flux success= Flux.just("Orange", "Apple", "Banana","Grape", "Strawbe
我现在正在使用 Flux .我想创建一个 Flux来自两个不同的对象 Flux .我知道我必须使用 BiFunction但我不知道怎么办。第一个对象对第一个对象有 PK,第二个 FK。我想压缩 PK=
我们正在重构一个大型 Backbone 应用程序以使用 Flux 来帮助解决一些紧密耦合和事件/数据流问题。但是,我们还没有弄清楚如何处理需要知道特定 ajax 请求状态的情况 当 Controlle
作为主题,Flux.concatMapIterable 和 Flux.flatMapIterable 都不会根据大理石图交错,这与 Flux.concatMap 和 Flux.flatMap 其中 f
我有一个flux这是由 Iterable 构建的8 个元素 ( Flux.fromIterable(..) )。对于每个通量排放,我想异步调用一个方法。我尝试了各种方法 dispatchOn和publ
Mono mono1 = repository.get(id); // data from reactive mongo Flux availabilityInfo = getAvailability
使用同构应用程序设置应用程序初始状态的一般做法是什么?如果没有 Flux,我会简单地使用类似的东西: var props = { }; // initial state var html = Reac
你好,我的代码是这样的: fun mapBatch(batch: List): Mono> ... fun myFun(stream: Flux): Flux { return stream
所以我从文档中了解到,并行 Flux 本质上是将通量元素划分为单独的轨道。(本质上类似于分组)。就线程而言,这将是调度程序的工作。因此,让我们考虑这样的情况。所有这些都将在通过 runOn() 方法提
我一直看到使用 flatMap 的例子对于 1 对 1 操作,例如: Flux.just("a", "b", "c") .flatMap(s -> Mono.just(s.toUpperCas
Flux.create 和有什么区别和 Flux.generate ?我正在寻找 - 最好是使用示例用例 - 了解我何时应该使用其中一个。 最佳答案 简而言之: Flux::create doesn'
我想发布 key 列表,但仅限于修改 key 时。 通过以下内容,即使没有任何更改,它也会以无限循环的方式发布值 RedisReactiveCommands commands = connec
我正在尝试从我从服务器获得的许多项目中实现无限滚动,但我找不到任何适当的方法来保持通量架构设计规则。 想法是:在第一次加载时,我从服务器获取完整的项目列表(只有 id),然后使用 ajax 每次获取
我有端点:/upstreams 它将返回以下格式的 Json: { "next" : "String", "data" : [ { "id" : "String",
我是一名优秀的程序员,十分优秀!