方法超时而不是等待

时间:2013-03-19 14:50:43

标签: breeze savechanges

在调用或等待服务器时,breeze上的savechanges方法似乎无限期地等待。有没有办法让它超时?我用 allowConcurrentSaves :false来调用保存更改。现在,这会导致用户以某种方式从服务器获得响应,只是无限期地挂起来,例如丢失互联网连接。

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

有什么想法吗?

由于

2 个答案:

答案 0 :(得分:1)

2014年5月16日更新

您可以使用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开发的优先级。