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

Gia*_*Elk 6 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);
  }
});
Run Code Online (Sandbox Code Playgroud)

我尝试使用Session vars,但反应性将其搞砸了,即下面的代码会在我的模板处理程序中触发错误(快速闪存到浏览器)并且一旦isMyError设置为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;
   }
};
Run Code Online (Sandbox Code Playgroud)

Aks*_*hat 8

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

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

如果要验证服务器是否在呼叫点处连接,最好检查Meteor.status().connected(哪个是被动的),只有在Meteor.call其他情况下才会运行错误

if(Meteor.status().connected)
    Meteor.call(....
else throwError("Error - not connected");
Run Code Online (Sandbox Code Playgroud)

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

你是否会Meteor.status().connected在流星是否连接的真实状态下经历60秒延迟的原因是浏览器没有办法检查它是否连接.

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

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

尝试成功:

流星的设计非常好,试图成功.而不是"尝试失败",并指出网络不可用的错误,最好尝试将所有内容排队,直到连接恢复为止.

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

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