在服务器上处理“长”请求时,我在禁用按钮时遇到问题。
我们的应用程序运行在 Java Spring/Tomcat 后端,前端使用 AngularJS。我们的用户可以点击“导出”按钮来获取一些统计数据的 CSV 文件。问题是这个文件是通过调用这样的 URL 在服务器端生成的:
<a ng-href="/exports?id={{the_id}}>Export</a>
Run Code Online (Sandbox Code Playgroud)
并且响应类型是:application/octet-stream。
请求工作正常,但可能有点慢。我想在文件生成时禁用该按钮,并在“保存文件”窗口出现后启用它。但是我无法通过简单的“同步”href 拦截这些事件。
我尝试异步处理请求,$http.get()但这一次,我不知道如何在处理完成后以相同的方式向用户提供文件(例如,Mega 为已经使用过它的人提供的方式)。
提前致谢 !
PS:我知道,使处理速度更快是另一种解决方案......但现在不可能,而不是重点:)
编辑:问题得到了解决,感谢 Ed 的回答,并进行了一些修改(我不知道这样做是否是“好”的方法,但实际上它完全按照我想要的方式对我有用)。
$scope.processExport = function(campaignId) {
if (!$scope.exportProcessing) {
$scope.exportProcessing = true;
$http.get('my_generating_url').success(function(response) {
$scope.exportProcessing = false;
$window.location.href = 'url_to_retrieve_the_file_with_' + response.fileName;
}).error(function() {
$scope.exportProcessing = false;
});
}
}
Run Code Online (Sandbox Code Playgroud)
以及相应的 HTML:
<button ng-click="processExport(the_id)" ng-disabled="exportProcessing">Export</button>
Run Code Online (Sandbox Code Playgroud)
并且my_generating_url只是在成功生成后返回文件名。
我目前正在试验MongoDB副本集机制.我已经有一个工作独立的Mongo服务器,其主数据库大约有20GB的数据.
我决定将此mongo服务器转换为主副本集服务器,然后添加具有类似配置的第二台计算机(但是更新的mongo版本),作为辅助副本集服务器.这很好,所有数据都按预期复制到辅助数据库.
但我想对数据执行一些更改操作(因为不知何故,我的数据模型已经改变,我需要,例如重命名一些属性,或者将引用转换为简单的ObjectId,有些类似的东西).与此同时,我想将具有旧版本(2.4)的第一台服务器更新为最新版本(2.6).
所以我决定按照MongoDB网站上的说明对副本集成员进行维护.
在另一个端口上独立重启服务器(两台服务器通常在27017上运行)
mongod --dbpath/my/database/path --port 37017
然后,服务器永远不会正确重启,我得到这个:
2014-10-03T08:20:58.716+0200 [initandlisten] opening db: myawesomedb
2014-10-03T08:20:58.735+0200 [initandlisten] myawesomedb Assertion failure _name == nsToDatabaseSubstring( ns ) src/mongo/db/catalog/database.cpp 472
2014-10-03T08:20:58.740+0200 [initandlisten] myawesomedb 0x11e6111 0x1187e49 0x116c15e 0x8c2208 0x765f0e 0x76ab3f 0x76c62f 0x76cedb 0x76d475 0x76d699 0x7fd958c3eec5 0x764329
/usr/bin/mongod(_ZN5mongo15printStackTraceERSo+0x21) [0x11e6111]
/usr/bin/mongod(_ZN5mongo10logContextEPKc+0x159) [0x1187e49]
/usr/bin/mongod(_ZN5mongo12verifyFailedEPKcS1_j+0x17e) [0x116c15e]
/usr/bin/mongod(_ZN5mongo8Database13getCollectionERKNS_10StringDataE+0x288) [0x8c2208]
/usr/bin/mongod(_ZN5mongo17checkForIdIndexesEPNS_8DatabaseE+0x19e) [0x765f0e]
/usr/bin/mongod() [0x76ab3f]
/usr/bin/mongod(_ZN5mongo14_initAndListenEi+0x5df) [0x76c62f]
/usr/bin/mongod(_ZN5mongo13initAndListenEi+0x1b) [0x76cedb]
/usr/bin/mongod() [0x76d475]
/usr/bin/mongod(main+0x9) [0x76d699]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf5) [0x7fd958c3eec5]
/usr/bin/mongod() [0x764329]
2014-10-03T08:20:58.756+0200 [initandlisten] exception in initAndListen: 0 assertion src/mongo/db/catalog/database.cpp:472, terminating
2014-10-03T08:20:58.757+0200 [initandlisten] …Run Code Online (Sandbox Code Playgroud) 我目前正在尝试编写一个使用 Spring Data Mongo 存储库的集成测试类。我使用de.flapdoodle.embed.mongo依赖项提供的嵌入式 Mongo 实例。Spring Data 文档指定我们只需将此依赖项放在项目EmbedMongoAutoConfiguration中,其余部分由它来处理。
现在,没关系,将端口设置为0使自动配置过程找到一个空闲端口来启动 mongo 实例。
此功能对我来说是必要的,以避免与其他测试(这些测试与我公司的其他项目一起在 Jenkins CI 服务器上运行)发生冲突。
现在问题来了,我希望能够在我的每个测试方法运行之前从某个外部文件注入一些测试数据。我发现 NoSQL Unit 可以通过一个简单的方法注释和一个 JUnit 来做到这一点@Rule。
下面是一个例子:
@Value("${local.mongo.port}")
private int mongoPort; // <- still 0 a the time the Rule below is created.
@Rule
public MongoDbRule managedMongoDb = new MongoDbRule(MongoDbConfigurationBuilder.mongoDb().databaseName("myAwesomeDb").port(mongoPort).build());
@Test
@UsingDataSet(locations = "testdata.json", loadStrategy = LoadStrategyEnum.CLEAN_INSERT)
public void testMyData() {
// ...
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,@Rule需要在其构建器中使用 Mongo 端口来实例化底层的 MongoClient,但是在实例化 @Rule 时,Spring 上下文尚未完全初始化并且EmbeddedMongoAutoConfiguration …
mongodb ×2
angularjs ×1
exception ×1
java ×1
junit-rule ×1
loading ×1
server-side ×1
spring-data ×1