Breeze 方法超时而不是等待
在调用或等待服务器时,breeze上的savechanges方法似乎会无限期地等待。有没有办法让它暂停?我正在调用save change with allowConcurrentSaves:false。现在,这导致不知何故无法从服务器获得响应的用户只能无限期地挂起,比如说断开互联网连接 我不想将allowConcurrentSaves的方法重新调用为false,以免复制数据 有什么想法吗Breeze 方法超时而不是等待,breeze,savechanges,Breeze,Savechanges,在调用或等待服务器时,breeze上的savechanges方法似乎会无限期地等待。有没有办法让它暂停?我正在调用save change with allowConcurrentSaves:false。现在,这导致不知何故无法从服务器获得响应的用户只能无限期地挂起,比如说断开互联网连接 我不想将allowConcurrentSaves的方法重新调用为false,以免复制数据 有什么想法吗 谢谢好问题,我希望我有一个好答案。但这绝对值得研究。请将此作为功能请求添加到。我们在确定发展优先事项时非常认
谢谢好问题,我希望我有一个好答案。但这绝对值得研究。请将此作为功能请求添加到。我们在确定发展优先事项时非常认真地对待这些要求 好问题,我希望我有个好答案。但这绝对值得研究。请将此作为功能请求添加到。我们在确定发展优先事项时非常认真地对待这些要求 2014年5月16日更新 从v.1.4.12开始,您可以使用AJAX适配器的
requestInterceptor
设置HTTP级别的超时和取消。请参阅文档
我仍然不愿意在save上使用此功能,因为您没有机会知道服务器是否保存了数据。当然,如果你的客户挂起或崩溃,你也不知道。这取决于你
原始答案
事实上,有一个现成的解决方案。它被称为timeout
,在中提到,并提供了一个在中实现和使用的简化示例
我知道你问了关于储蓄的问题,但你的问题与一般的承诺有关。下面是一个根据中的queryTests.js改编的查询示例
var timeoutMs=10000;//10秒超时
var em=newEm();//创建一个新的EntityManager
var query=new EntityQuery()。来自(“客户”)。使用(em);
Q.timeout(query.execute,timeoutMs)
.then(查询完成前超时)
.失败(查询失败或退出);
函数queryFailedOrTimedout(错误){
var expect=/timed out/i;
var emsg=错误消息;
if(预期测试(emsg)){
日志(“查询超时,带有消息“{0}”+expectTimeoutMsg)
。格式(emsg);
//做点什么
}否则{
handleFail(错误);
}
}
注意:我刚刚添加了这个测试,所以您必须从github获得if,或者等待1.2.5之后的Breeze发布
哎呀。。。也许不是
我对查询给出了我认为很好的答案。这可能不是保存的正确答案
save的问题是,在服务器响应之前,您不知道客户机上的保存是否成功。一路上任何地方都可能出问题。服务器可能没有听到保存请求。服务器可能在保存过程中失败。服务器可能已保存数据,但响应从未返回到客户端
更改allowConcurrentSaves
的值不会使您摆脱此绑定。也不会有保存超时
事实上,向保存添加超时可能是欺骗。甚至可以在自定义超时后到达保存响应。。。在这种情况下,Breeze将尝试更新您的EntityManager。。。你不会知道Breeze成功了还是失败了
如果我们添加了一个微风保存超时怎么办。它应该做什么?如果微风说拯救有时间。。。Breeze忽略了服务器的延迟响应?然后想象一下,保存在服务器上成功了——它只是花了“太长时间”才响应客户机。现在您有了一个状态与服务器意外不同步的客户机。这不好
所以我认为你想要一个不同的解决方案来解决这个非常现实的问题。这确实是一个用户体验问题。您可以向用户指示您认为保存仍在进行中,然后设置自己的计时器。如果在计时器过期时未完成保存,则可以查询服务器以查看数据是否已保存或是否存在连接。。。或者类似的东西。老实说,我现在想不出更好的办法了
注意,我假设您需要知道服务器成功了。如果您避免存储生成的ID,并且总是假设保存成功,除非服务器告诉您其他情况。。。这是一个完全不同的范例和编程模型,我们有一天可以讨论(参见)
所有这些:我非常确定保存超时不是您想要的
但在查询中仍然有用:)2014年5月16日更新
从v.1.4.12开始,您可以使用AJAX适配器的requestInterceptor
设置HTTP级别的超时和取消。请参阅文档
我仍然不愿意在save上使用此功能,因为您没有机会知道服务器是否保存了数据。当然,如果你的客户挂起或崩溃,你也不知道。这取决于你
原始答案
事实上,有一个现成的解决方案。它被称为timeout
,在中提到,并提供了一个在中实现和使用的简化示例
我知道你问了关于储蓄的问题,但你的问题与一般的承诺有关。下面是一个根据中的queryTests.js改编的查询示例
var timeoutMs=10000;//10秒超时
var em=newEm();//创建一个新的EntityManager
var query=new EntityQuery()。来自(“客户”)。使用(em);
Q.timeout(query.execute,timeoutMs)
.then(查询完成前超时)
.失败(查询失败或退出);
函数queryFailedOrTimedout(错误){
var expect=/timed out/i;
var emsg=错误消息;
if(预期测试(emsg)){
日志(“查询超时,带有消息“{0}”+expectTimeoutMsg)
。格式(emsg);
//做点什么
}否则{
handleFail(错误);
}
}
注意:我刚刚添加了这个测试,所以您可以
var timeoutMs = 10000; // 10 second timeout
var em = newEm(); // creates a new EntityManager
var query = new EntityQuery().from("Customers").using(em);
Q.timeout(query.execute, timeoutMs)
.then(queryFinishedBeforeTimeout)
.fail(queryFailedOrTimedout);
function queryFailedOrTimedout(error) {
var expect = /timed out/i;
var emsg = error.message;
if (expect.test(emsg)) {
log("Query timed out w/ message '{0}' " + expectTimeoutMsg)
.format(emsg));
// do something
} else {
handleFail(error);
}
}