Breeze 方法超时而不是等待

Breeze 方法超时而不是等待,breeze,savechanges,Breeze,Savechanges,在调用或等待服务器时,breeze上的savechanges方法似乎会无限期地等待。有没有办法让它暂停?我正在调用save change with allowConcurrentSaves:false。现在,这导致不知何故无法从服务器获得响应的用户只能无限期地挂起,比如说断开互联网连接 我不想将allowConcurrentSaves的方法重新调用为false,以免复制数据 有什么想法吗 谢谢好问题,我希望我有一个好答案。但这绝对值得研究。请将此作为功能请求添加到。我们在确定发展优先事项时非常认

在调用或等待服务器时,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); } }