在调用或等待服务器时,breeze上的savechanges方法似乎无限期地等待。有没有办法让它超时?我用 allowConcurrentSaves :false来调用保存更改。现在,这会导致用户以某种方式从服务器获得响应,只是无限期地挂起来,例如丢失互联网连接。
我不想将 allowConcurrentSaves 的方法重新调用为false,因为我担心我可能会复制数据。
有什么想法吗?
由于
答案 0 :(得分:1)
您可以使用AJ.1适配器的requestInterceptor
从v.1.4.12开始设置HTTP级别的超时和取消。请参阅文档"Controlling AJAX calls"。
我仍然不愿意在保存时使用此功能,因为您无法知道服务器是否持久存储数据。当然,如果您的客户端挂起或崩溃,您无论如何都不知道。这取决于你。
实际上,Q.js有一个现成的解决方案。它被称为timeout
,并在API reference中提及了readme.md中实现和使用的简化示例。
我知道你问过Save但是你的问题与一般的承诺有关。以下是从our DocCode Sample
中的queryTests.js改编的查询示例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); } }
注意:我刚刚添加了这个测试,所以你必须从github获取if或者在1.2.5之后等待Breeze发布。
我给出了我认为查询的绝佳答案。它可能不是保存的正确答案。
save的问题在于客户端上不知道保存是否成功,直到服务器响应。在路上的任何地方都可能出错。服务器可能没有听到保存请求。保存期间服务器可能已失败。服务器可能已保存数据,但响应从未将其返回给客户端。
更改allowConcurrentSaves
的值不会让您脱离此绑定。也没有保存超时。
事实上,为保存添加超时可能是欺骗。甚至可以在自定义超时后到达保存响应...在这种情况下,Breeze将尝试更新您的EntityManager ......并且您不会知道Breeze是成功还是失败!
如果我们添加了Breeze保存超时怎么办?它该怎么办?如果微风说保存时间已经超时...... Breeze忽略了服务器迟来的反应?然后想象一下,在服务器上保存成功 - 它只是花了太长时间来响应客户端。现在你有一个客户端,其状态意外地与服务器不同步。这不好。
所以我认为你想要一个不同的解决方案来解决这个非常现实的问题。这真的是一个用户体验问题。您可以向用户表明您认为保存仍在进行中,然后设置您自己的计时器。如果在计时器到期时未执行保存,则可以查询服务器以查看数据是否已保存,或者是否存在连接......或者这些行中的某些内容。我现在不能想到一个更好的方法。
请注意,我假设你需要知道服务器成功了。如果你避免存储生成的ID并且总是假设保存成功,除非服务器告诉你...那么这是一个完全不同的范例和编程模型,我们有一天可以讨论(参见meteorjs)。 / p>
所有这一切的网络:我很确定保存超时不是您想要的。
虽然在查询中仍然有用:)
答案 1 :(得分:0)
很好的问题,我希望我有一个好的答案。但绝对值得研究。您能否将此作为功能请求添加到Breeze User Voice。我们非常重视这些要求,以确定我们对Breeze开发的优先级。