服务器连接断开时如何检查Meteor.call()是否失败?

时间:2014-01-04 21:10:24

标签: meteor

当Meteor服务器连接丢失时,如何验证Meteor.call()是否失败? Meteor.call()不返回任何值。当您的应用程序运行时,基本上是Meteor shell中的Ctrl + Z,然后在触发Meteor.call的应用程序中执行某些操作,即添加新的博客帖子:

Meteor.call('createPhrase', phrase, function(error) {
  console.log("This NEVER gets called if server is down.");

  if (error) {
     throwError(error.reason);
  }
});

我尝试使用Session vars,但是反应性将其搞砸了,即下面的代码会在我的模板处理程序中触发错误(快速闪存到浏览器)并且只要将myMyError设置为true,那么当Meteor.call成功,错误因为isMyError = false而消失,但这看起来真的很草率。

Session.set("isMyError", true);

Meteor.call('createPhrase', phrase, function(error) {
   console.log("This NEVER gets called if server is down.");

   Session.set("isMyError", false);

    if (error) {
        throwError(error.reason);
    }
});


Template.index.isMeteorStatus = function () {

   myClientStatus = Meteor.status();

   if ( (myClientStatus.connected === false) || (Session.get("isMyError") === true) ) {
     return false;
   } else {
     return true;
   }
};

1 个答案:

答案 0 :(得分:8)

Meteor的调用通常会进入一个队列,按照调用它们的顺序发送到服务器。如果没有连接,它们将保留在队列中,直到服务器再次连接为止。

这就是没有返回的原因,因为Meteor希望它可以重新连接然后发送呼叫,当它发生时它最终会返回结果。

如果要验证服务器是否在呼叫点处连接,最好检查Meteor.status().connected(这是被动的),只有运行Meteor.call否则会抛出错误

if(Meteor.status().connected)
    Meteor.call(....
else throwError("Error - not connected");

您还可以使用navigator.onLine检查网络是否已连接。

对于meteor是否已连接的真实状态,您将遇到Meteor.status().connected延迟60秒的原因是浏览器无法检查其是否已连接。

流星发出定期心跳,在websocket / long轮询线上发出'h'以检查它是否已连接。一旦它意识到它没有在另一端获得心跳,它标志着连接断开。

但是,如果发送Meteor.call或某些数据且套接字无法发送任何数据,它也会将其标记为已断开连接。如果您事先使用Meteor.call Meteor.status().connected,它会很快意识到它已断开连接。我不确定它会立即意识到你可以在接下来的一行之后使用它们,但是你可以在一两秒之后使用Meteor.setTimeout来发起呼叫。

尝试成功:

Meteor设计得很好,试图成功。而不是“尝试失败”,并指出网络不可用的错误,最好尝试将所有内容排队,直到连接恢复为止。

最好的办法是避免告诉用户网络已关闭,因为通常他们会知道这一点。排队的任务确保一旦连接恢复,用户流就不会改变。

因此,最好使用重新连接过程中构建的队列,而不是避免它们。