我的 ionic 应用程序有一个计时器(一个简单的 setInterval,每秒滴答一次),当应用程序位于前台时,它工作得很好。然而,当应用程序进入后台并在 10 分钟后返回前台时,应用程序中显示的时间是错误的(时间比应该的少得多)。我试过将计时器添加到指令中并使用 native DOM 操作 api(document.getElementById 等)方法,但它们都不起作用。我认为当应用程序进入后台时, ionic 框架正在对 View 和绑定(bind)做一些事情。有没有人遇到过这样的问题?如果遇到过,你们是如何解决的?
最佳答案
经过几个小时的寻找答案,我终于想出了自己的 hack。我希望这个解决方案可以帮助遇到类似问题的其他人。
当应用程序进入后台时,在某个随机时间,计时器停止计时并进入休眠状态,直到应用程序返回前台。 当应用程序出现在前台时,计时器会从它进入休眠状态的那一刻开始再次计时。
将时间戳记录在一个单独的变量中(以秒为单位),并在计时器的每个时间间隔内更新它。
var timeStamp = Math.floor(Date.now()/1000);
如果您之前间隔的时间戳与最新(新)时间戳之间的差异大于一秒,则检查计时器的每个间隔。如果满足条件,则将这两个时间戳之间的差异添加到您的滴答时间。
应用在前台
如果(当前时间戳 - 前一个时间戳 > 1)
{
将上述差值加到时间上
}
在间隔结束之前,使用 currentTimeStamp 更新 TimeStamp 变量。
后台应用
奇怪的是,10 分钟后,计时器进入休眠状态(我们的计时器实际上正在失去对现在时间的跟踪,因为下一个间隔没有触发)。
应用从后台返回前台
计时器从它停止的地方开始计时(即下一个间隔)。现在我们的条件差异应该超过一秒,因此将这个差异(基本上是损失的时间)加到我们当前的滴答时间上。
var transactionTime = 0; //Initial time of timer
var timeStamp = Math.floor(Date.now() / 1000);
var deltaDelay = 1;
setInterval(function () {
if (transactionTime != 0 && (Math.floor(Date.now() / 1000) - timeStamp) > deltaDelay) {
transactionTime += (Math.floor(Date.now() / 1000) - timeStamp);
}
timeStamp = Math.floor(Date.now() / 1000);
//Update your element with the new time.
window.document.getElementById("transaction_timer").innerHTML = util.formatIntoHHMMSS(transactionTime++);
}, 1000);
注意:这个解决方案可以独立工作(带有原生 DOM api 的 vanilla Js)并且在 Angular Directive(指令)中也很好用。
如果您的单个线程有可能在其他地方忙于其他任务,您可以将上述代码的 deltaTime 增加到 2 以更加准确。
P.s 我实际上是在我自己的 webview 实例中运行 ionic 应用程序而不是 cordova,所以我不能使用任何花哨的 cordova 插件。
关于javascript - ionic 应用程序中的计时器(setInterval)在后台运行一段时间后进入休眠状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32088711/
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0
在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/
exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby中使用两个参数异步运行exe吗?我已经尝试过ruby命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何rubygems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除
我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r
Sinatra新手;我正在运行一些rspec测试,但在日志中收到了一堆不需要的噪音。如何消除日志中过多的噪音?我仔细检查了环境是否设置为:test,这意味着记录器级别应设置为WARN而不是DEBUG。spec_helper:require"./app"require"sinatra"require"rspec"require"rack/test"require"database_cleaner"require"factory_girl"set:environment,:testFactoryGirl.definition_file_paths=%w{./factories./test/
当我的预订模型通过rake任务在状态机上转换时,我试图找出如何跳过对ActiveRecord对象的特定实例的验证。我想在reservation.close时跳过所有验证!叫做。希望调用reservation.close!(:validate=>false)之类的东西。仅供引用,我们正在使用https://github.com/pluginaweek/state_machine用于状态机。这是我的预订模型的示例。classReservation["requested","negotiating","approved"])}state_machine:initial=>'requested
我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查
这个问题在这里已经有了答案:Railsformattingdate(4个答案)关闭4年前。我想格式化Time.Now函数以显示YYYY-MM-DDHH:MM:SS而不是:“2018-03-0909:47:19+0000”该函数需要放在时间中.现在功能。require‘roo’require‘roo-xls’require‘byebug’file_name=ARGV.first||“Template.xlsx”excel_file=Roo::Spreadsheet.open(“./#{file_name}“,extension::xlsx)xml=Nokogiri::XML::Build
我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s