2013-03-19 41 views
1

看起来,在调用或等待服务器时,breeze上的savechanges方法会无限期地等待。有没有办法让它超时?我打电话保存更改allowConcurrentSaves:false。这现在导致用户不知道如何从服务器得到响应,无限期地简单地挂起来,例如用掉落的互联网连接。方法超时而不是等待

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

任何想法?

感谢

回答

0

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

1

更新2014年5月16日

您可以设置HTTP级超时和取消与AJAX适配器的requestInterceptor作为v.1.4.12的。请参阅文档"Controlling AJAX calls"

我还是不愿意在保存时使用这个功能,因为你没有机会知道服务器是否保存了数据。当然,如果你的客户挂起或崩溃,你不知道。随你便。

原来的答案

其实,有来自Q.js一个现成的解决方案。它的名称为timeout,在API reference中提到了它的一个简化示例,它的实现和在readme.md中的使用。

我知道你问过保存问题,但你的问题与一般承诺有关。这是改编自queryTests.js查询例如our DocCode Sample

 
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或1.2.5之后等待微风释放。

哎呀......也许不是

我给什么,我认为是查询一个伟大的答案。这可能不是保存的正确答案。

保存的问题是您不知道客户端上的保存是否成功,直到服务器响应。事情沿途可能会出错。服务器可能没有听到要保存的请求。保存期间服务器可能失败。服务器可能保存了数据,但响应从未将其返回给客户端。

更改allowConcurrentSaves的值不会使您脱离此绑定。也不会有保存超时。

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

如果我们添加了Breeze保存超时值,该怎么办?它应该做什么?如果微风说节省时间已经过去了...... Breeze忽略了服务器迟来的回应?然后想象一下,在服务器上保存成功 - 它只是花了“太长时间”才能响应客户端。现在你已经有了一个客户端,其状态意外地与服务器不同步。不是很好。

所以我想你想要一个不同的解决方案来解决这个非常真实的问题。这真是一个用户体验问题。您可以向用户表明您认为保存仍在进行中,然后设置您自己的计时器。如果在定时器到期时没有完成保存,则可以查询服务器以查看数据是否已保存,或者是否存在连接......或沿着这些行的内容。我现在无法真正想到更好的方式。

请注意,我假设您需要知道服务器成功。如果你避免了商店生成的ID,并且总是假设保存成功,除非服务器另有告知......否则这是一种完全不同的范式和编程模型,我们可能会在某一天讨论它(请参阅meteorjs

所有这一切的网络:我很沉默保存超时不是你想要的

尽管对查询仍然有用:)