1

在调用或等待服务器时,微风上的 savechanges 方法似乎无限期地等待。有没有办法让它超时?我用allowConcurrentSaves调用保存更改:false。现在,这会导致以某种方式无法从服务器获得响应的用户无限期地陷入困境,例如互联网连接断开。

我不想用allowConcurrentSaves重新调用该方法,因为担心我可能会复制数据。

有任何想法吗?

谢谢

4

2 回答 2

1

2014 年 5 月 16 日更新

requestInterceptor从 v.1.4.12 开始,您可以使用 AJAX 适配器设置 HTTP 级别的超时和取消。请参阅文档“控制 AJAX 调用”

我仍然不愿意在保存时使用此功能,因为您没有机会知道服务器是否保留了数据。当然,如果您的客户端挂起或崩溃,您也不知道。由你决定。

原始答案

实际上, Q.js有一个现成的解决方案。它被调用timeout并在 API 参考中提到,并在readme.md中提供了其实现和使用的简化示例。

我知道你问过 Save 但你的问题一般与承诺有关。这是一个从我们的 DocCode 示例中的 queryTests.js改编的查询示例

var timeoutMs = 10000; // 10 秒超时
var em = newEm(); // 创建一个新的EntityManager

var query = new EntityQuery().from("Customers").using(em);

Q.timeout(query.execute, timeoutMs)
    .then(queryFinishedBeforeTimeout)
    .fail(queryFailedOrTimedout);

函数查询失败或超时(错误){
    变种期望= /超时/我;
    var emsg = 错误消息;
    if (expect.test(emsg)) {
        log("查询超时,消息为 '{0}'" + expectTimeoutMsg)
            .格式(emsg));
        // 做一点事
    } 别的 {
        处理失败(错误);
    }
}

注意:我刚刚添加了这个测试,所以你必须从 github 获取或者等待 1.2.5 之后的 Breeze 版本。

哎呀...也许不是

我给出了我认为是query的一个很好的答案。这可能不是save的正确答案。

保存的问题是,在服务器响应之前,您不知道客户端是否保存成功。在此过程中,任何地方都可能出现问题。服务器可能没有听到保存请求。服务器可能在保存期间出现故障。服务器可能已经保存了数据,但响应从未返回给客户端。

更改 的值allowConcurrentSaves不会让您摆脱这种束缚。两者都不会有保存超时。

事实上,为保存添加超时可能是骗人的。保存响应甚至可能在您的自定义超时之后到达……在这种情况下,Breeze 将尝试更新您的 EntityManager ……您将不知道 Breeze 是成功还是失败!

如果我们添加 Breeze 保存超时会怎样。它应该怎么做?如果微风说保存已超时......并且微风忽略了服务器迟来的响应怎么办?然后想象一下服务器上的保存成功 - 它只是花了“太长时间”才响应客户端。现在您有一个客户端,其状态意外地与服务器不同步。情况不妙。

所以我认为你想要一个不同的解决方案来解决这个非常现实的问题。这确实是用户体验问题。您可以向用户表明您认为保存仍在进行中,然后设置您自己的计时器。如果您的计时器到期时保存未完成,您可以查询服务器以查看数据是否已保存或是否存在连接......或类似的东西。老实说,我现在想不出更好的方法。

请注意,我假设您需要知道服务器已成功。如果您避免使用商店生成的 ID 并始终假设保存成功,除非服务器另有说明……那是完全不同的范式和编程模型,我们有一天可以讨论(请参阅meteorjs

所有这一切的网络:我非常确定保存超时不是你想要的。

虽然在查询中仍然有用:)

于 2013-03-20T19:43:06.783 回答
0

很好的问题,我希望我有一个很好的答案。但这绝对值得研究。您能否将此作为功能请求添加到Breeze User Voice中。在确定 Breeze 开发的优先事项时,我们非常重视这些要求。

于 2013-03-19T17:33:42.867 回答