- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
好吧,我被 reactjs、flux 架构和 react-router 的问题困住了。我有以下路线(只是路线的一部分):
<Route name="prepare-seniors">
<Route name="senior" path=":candidateId" handler={SeniorCandidate}>
<DefaultRoute handler={SeniorProfile}/>
<Route name="senior-recommendations" path="recommends">
<DefaultRoute handler={SeniorRecommends}/>
<Route name="senior-rec-new" path="new"/>
</Route>
</Route>
</Route>
Senior Profile View 进行 API 调用以加载个人数据。当您导航到 Recommends View 时,个人的 ID 用于进行另一个调用以加载推荐。如果我先查看个人资料页面并导航到推荐页面,效果会很好。但是,如果我进行硬重载,我会得到:
Uncaught Error: Invariant Violation: Dispatch.dispatch(...): Cannot dispatch in the middle of a dispatch.
我意识到这是因为在第一个 API 返回后调用分派(dispatch),它退出并开始更新组件。在完成之前,推荐页面会调用其 API 并尝试发送其结果。我在论坛上读到 React.addons.batchUpdates 是解决此问题的一种方法,但我不知道如何让它工作。 GitHub Batch Updates Issue和此处讨论类似内容的另一个链接 Trying to use waitFor .第一个建议通过添加以下内容来调整调度程序:
// assuming a var `flux` containing your Flux instance...
var oldDispatch = flux.dispatcher.dispatch.bind(flux.dispatcher);
flux.dispatcher.dispatch = function(action) {
React.addons.batchedUpdates(function() {
oldDispatch(action);
});
};
但我无法完成这项工作。也许我只是错误地实现了它。
我已经阅读了 Chat 和 TodoMVC 示例。我了解 waitFor 在聊天示例中的使用方式...但是它们都使用相同的 API,因此很明显,一个将等待另一个。我的问题涉及 API 和调度之间的竞争条件……我认为 setTimeout 不是一个好的解决方案。
我需要了解如何设置调度程序,使其能够对调度或 API 调用进行排队。或者更好的方法来告诉每个组件为其数据进行 API 调用,所以我什至没有调度问题。
哦,这是我的 Dispatcher.js 文件,您可以看到它是如何设置的:
'use strict';
var flux = require('flux'),
Dispatcher = require('flux').Dispatcher,
React = require('react'),
PayloadSources = require('../constants/PayloadSources'),
assign = require('object-assign');
//var oldDispatcher = flux.Dispatcher.dispatch.bind(AppDispatcher);
//
//flux.dispatcher.dispatch = function(action) {
// React.addons.batchedUpdates(function() {
// oldDispatcher(action);
// });
//};
var AppDispatcher = assign(new Dispatcher(), {
handleServerAction: function(action) {
var payload = {
source: PayloadSources.SERVER_ACTION,
action: action
};
this.dispatch(payload);
},
handleViewAction: function(action) {
if (!action.type) {
throw new Error('Empty action.type: you likely mistyped the action.');
}
var payload = {
source: PayloadSources.VIEW_ACTION,
action: action
};
this.dispatch(payload);
}
});
module.exports = AppDispatcher;
最佳答案
好的,首先我要说的是,我目前正在学习 React 和 Flux,绝不是专家。不过我还是要试一试:
根据您所说的,听起来您有 2 个异步操作触发,然后当它们返回时尝试发送调度消息由 2 个独立的 aync web 服务调用触发两次调度调用引起的问题。
我不认为在这种情况下批量更新会有帮助,因为它在很大程度上取决于时间(即,如果它已经排队重新渲染并正在等待第二次调用进入时执行的机会,它可能批处理成功,但是如果它是在更新中期出现的,那么您将处于与现在完全相同的情况)。
我认为这里的实际问题来自如何/何时触发这些操作(您在帖子末尾简要提到了这一点)。听起来您正在从 React 组件 Render 调用中触发操作(有点像延迟加载)。这几乎正是 Flux 试图避免的事情,因为这种模式很容易导致应用程序流中的无限循环或奇怪的状态/模式。
正如您在描述中提到的,您可能需要预先触发此加载,而不是从各个组件触发,据我所知,我建议需要在对核心组件调用 React.render 之前完成。如果您查看示例聊天应用程序,他们会在 app.js 中做类似的事情。 :
ChatExampleData.init(); // load example data into localstorage
ChatWebAPIUtils.getAllMessages();
React.render(
<ChatApp />,
document.getElementById('react')
);
所以我建议遵循上述模式,在向客户端显示加载微调器的同时预先加载任何初始数据。
或者,根据您的技术堆栈,您可以最初在服务器上呈现(节点示例 here ReactJS.Net 的 .Net 版本),这样您就不会在客户端启动时出现延迟(您也可以避免所有搜索引擎索引的有趣业务,如果这是一个问题(顺便说一句,我没有尝试过其中任何一个,只是阅读它们)。
关于javascript - React、Flux、React-Router Dispatch Error - 可能的 batchUpdates 解决方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28759728/
这个问题已经有答案了: Java MongoDB save multiple documents at once (5 个回答) 已关闭 3 年前。 jdbcTemplate.batchUpdate(
谁能帮我解答一下这个问题:如果我执行 JDBC batchUpdate,它更新多个表并且不包含在任何事务中,它会锁定任何表或行吗? 我的代码执行一堆 UPDATE 语句,所有语句如下所示 St
我正在使用 batchUpdate() 在表中插入多条记录。根据要求,如果主键在插入时存在重复值,则应使用最新接收到的数据对其进行更新,因此我尝试在 INSERT< 中使用 ON DUPLICATE
我在 UICollectionView 的 batchUpdate 操作中确定了一个简单的边缘情况,它应该可以工作但失败了 attempt to perform an insert and a mov
类似的电话 spreadsheets.batchUpdate和 spreadsheets.values.batchUpdate可以在一次调用中执行多个更新操作。 我在 https://develope
我正在使用 NamedParameterJdbcTemplate.batchUpdate 对我的数据库表进行批量更新,但我想禁用 auto-commit 并手动执行提交。 我可以从 connectio
在处理大量查询时,我遇到了 JdbcTemplate.batchUpdate(String[] requests) 方法的问题。 该语句正在执行,没有任何异常,但更新未反射(reflect)在数据库中
我正在尝试使用 batchUpdate 更新表中的数千行。我的要求是: 1) 假设一个批次有 1000 条记录。记录号 235 导致了错误。如何找出导致错误的记录。 2) 假设记录 600 没有导致更
这个问题已经有答案了: JDBC Batch Update Problem (7 个回答) 已关闭 9 年前。 我正在使用 spring 的 NamedParameterJdbcTemplate ba
我正在使用 spring 将批处理记录插入到数据库中。但我收到此错误:java.sql.SQLException:无法在 java.util.ArrayList 和 JAVA_OBJECT 之间转换。
我正在尝试使用 org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate 批量更新表。 nameParameterJdbc
我有一个使用 Spring 的名为 JDBC 的 mysql batchUpdate,如下所示: public SqlParameterSource[] getBatchParamsArray(Col
需要插入记录使用spring jdbctemplate批量更新。插入时如果发现重复记录,则需要更新记录否则插入。我怎么做?下面是我的代码。 注意:没有包含异常处理。 result = jdbcTem
我有一个 collectionView,它有 3 个部分,每个部分都有一个不同的单元格(将单元格的数据分成单独的部分比只分成 1 个部分更容易)。 collectionView 的数据源中只有一个 d
我正在做的项目使用了以下依赖 org.springframework spring-jdbc 3.2.0.RELEASE 有了这个,我将进行以下方法调用 (1) temp
我想从 org.springframework.jdbc.core.JdbcTemplate.batchUpdate 获取插入/更新的行 ID(主键) 有什么方法可以像 this 一样使用 KeyHo
我一直在寻找一种最佳方式更新大量行的方法,因为 orm 操作速度很慢,最终我当前使用的解决方案是通过 jdbc 批量更新将数据库更新包装在 forkjoinpool 任务中。(使用 ORM 在数据库中
我正在尝试使用批量更新来更新表中的数据。当我更新数据时,出现了一些失败。我想获取失败查询的更新语句。例如,如果失败的查询是“update table set abc= 123”。然后我希望异常处理程序
假设,我们要通过java代码在mysql表中插入20行。以下哪种方法有效以及原因。 1)使用executeBatch将所有插入语句合并为一批,然后使用Preparedstatement的commit方
我有 MariaDb 实例和一个临时表。工作流程: 开始交易 如果存在则删除临时表,创建临时表 使用 insert into TEMP1 (xxx,yyy) values(?,?),(?,?),(?,
我是一名优秀的程序员,十分优秀!