当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)
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在一两秒之后使用它来发起呼叫.
流星的设计非常好,试图成功.而不是"尝试失败",并指出网络不可用的错误,最好尝试将所有内容排队,直到连接恢复为止.
最好的办法是避免告诉用户网络已关闭,因为通常他们会知道这一点.排队的任务确保一旦连接恢复,用户流就不会改变.
因此,最好使用重新连接过程中构建的队列而不是避免它们.
| 归档时间: |
|
| 查看次数: |
2388 次 |
| 最近记录: |