我有一个针对iOS和Android设备的jQuery Mobile网络应用程序.应用程序的一个组件是后台任务,它定期检查a.)对本地数据的更改以及b.)与服务器的连接.如果两者都为真,则任务会推送更改.
我正在使用一个简单的基于setTimeout()的函数来执行此任务.每个失败或成功条件都会在后台任务上调用setTimeout(),确保它以30秒的间隔运行.我使用上一个任务运行时的时间戳更新状态div以进行调试.
在任何桌面浏览器中,这都可以正常工作; 但是,在iOS或Android上,经过一段时间后,任务就会停止执行.我想知道这是否与设备的省电设置有关 - 当iOS进入待机状态时,是否会终止JavaScript执行?这似乎发生了.
如果是这样,恢复的最佳方式是什么?是否有可以挂钩的唤醒事件?如果没有,还有哪些其他选项不涉及依赖于用户交互的事件(我不想将整个页面绑定到单击事件只是为了重新启动后台任务).
我在这里得到了这个代码:
var date = new Date();
setTimeout(function(e) {
var currentDate = new Date();
if(currentDate - date >= 1000) {
console.log(currentDate, date);
console.log(currentDate-date);
}
else {
console.log("It was less than a second!");
console.log(currentDate-date);
}
}, 1000);
Run Code Online (Sandbox Code Playgroud)
在我的计算机中,它总是正确执行,在控制台输出中为1000.有兴趣在其他计算机,相同的代码,超时回调开始不到一秒钟,差异currentDate - date在980和998之间.
我知道存在解决这种不准确性的库(例如,Tock).
基本上,我的问题是:原因setTimeout是什么,因为在给定的延迟中不会触发?可能是计算机速度太慢而且浏览器会自动尝试适应缓慢并且之前触发事件?
PS:以下是Chrome JavaScript控制台中执行的代码和结果的屏幕截图:

如何在一定时间后超时承诺?我知道Q有一个承诺超时,但我使用的是本机NodeJS承诺而且它们没有.timeout函数.
我错过了一个或其包装不同吗?
或者,下面的实现是否有利于不吸收内存,实际上按预期工作?
我也可以以某种方式将其全局包装,以便我可以将它用于我创建的每个承诺,而不必重复setTimeout和clearTimeout代码?
function run() {
logger.info('DoNothingController working on process id {0}...'.format(process.pid));
myPromise(4000)
.then(function() {
logger.info('Successful!');
})
.catch(function(error) {
logger.error('Failed! ' + error);
});
}
function myPromise(ms) {
return new Promise(function(resolve, reject) {
var hasValueReturned;
var promiseTimeout = setTimeout(function() {
if (!hasValueReturned) {
reject('Promise timed out after ' + ms + ' ms');
}
}, ms);
// Do something, for example for testing purposes
setTimeout(function() {
resolve();
clearTimeout(promiseTimeout);
}, ms - 2000);
});
}
Run Code Online (Sandbox Code Playgroud)
谢谢!
鉴于此代码:
bob = setInterval(function, 1000);
clearInterval(bob);
Run Code Online (Sandbox Code Playgroud)
现在有办法知道该间隔是否已被清除?
目前,我通过取消' bob'来跟踪这个问题,但是如果我的额外代码行是不必要的,我很好奇:
clearInterval(bob);
bob = null;
if (!bob) itIsCleared();
Run Code Online (Sandbox Code Playgroud)
谢谢!
我需要实现一个函数,在单击一个按钮60秒后运行.请帮助,我使用了Timer类,但我认为这不是最好的方法.
我需要在用户停止输入时执行搜索.我知道我应该使用setTimeout().但是使用Reactjs我无法找到它是如何工作的.有人可以告诉我如何在用户停止键入几秒钟时调用一个方法(将处理搜索)(假设5).我无法弄清楚在哪里编写代码以检查用户是否已停止输入.
import React, {Component, PropTypes} from 'react';
export default class SearchBox extends Component {
state={
name:" ",
}
changeName = (event) => {
this.setState({name: event.target.value});
}
sendToParent = () => {
this.props.searching(this.state.name);
}
render() {
return (
<div>
<input type="text" placeholder='Enter name you wish to Search.' onChange={this.changeName} />
</div>
);
}
}
Run Code Online (Sandbox Code Playgroud)
我想在用户停止输入时调用sendToParent方法.
这是我第一次真正深入了解JavaScript.当然我以前用过它,但我从来没有真正从头开始写任何东西.
无论如何,我有一个非常奇怪的问题,我希望有人可以为我找到.
我正在尝试将文本从div淡出从黑色变为白色.很简单,是吗?
以下代码有效.它会将颜色更改为白色,但是会忽略500ms的setTimeout时间.
如果您使用Chrome并查看JS控制台,您将很容易看到几乎是瞬间调用doFade()方法,而不是每500毫秒.
有谁能解释一下?
var started = false;
var newColor;
var div;
var hex = 0;
function fadestart(){
if (typeof fadestart.storedColor == 'undefined') {
div = document.getElementById('test');
fadestart.storedColor = div.style.color;
}
if(!started){
console.log('fadestart');
newColor = fadestart.storedColor;
started = true;
setTimeout(doFade(), 500);
}
}
function fadestop(){
console.log('fadestop');
div.style.color = fadestart.storedColor;
started = false;
hex = 0;
}
function doFade(){
if(hex<=238){
console.log(hex);
hex+=17;
div.style.color="rgb("+hex+","+hex+","+hex+")";
setTimeout(doFade(), 500);
}
}
Run Code Online (Sandbox Code Playgroud) 我想用Javascript进行秒倒计时.
这是我的HTML
<div id="ban_container" class="error center">Please wait
<span id="ban_countdown" style="font-weight:bold">
45</span>
seconds before trying again
</div>
Run Code Online (Sandbox Code Playgroud)
我的JS:
<script type="text/javascript">
var seconds = <?php echo $user->getBlockExpiryRemaining(); ?>;
function countdown(element) {
var el = document.getElementById(element);
if (seconds === 0) {
document.getElementById("ban_container").innerHTML = "done";
return;
}
else {
el.innerHTML = seconds;
seconds--;
setTimeout(countdown(element), 1000);
}
}
countdown('ban_countdown');
</script>
Run Code Online (Sandbox Code Playgroud)
但是由于某种原因,它不会等待超时时间,而是立即执行countdown,这样当我刷新页面时它就会立即显示"完成".我知道它实际上是多次被执行,因为如果我这样做,innerHTML += seconds + " ";它会从45开始倒数.为什么超时会被超时?
我正在写一张检查,看看是否有超时.我在想这样做:
var a = setTimeout(fn, 10);
// ... Other code ... where clearTimeout(a) can be called and set to null
if (a != null)
{
// do soemthing
}
Run Code Online (Sandbox Code Playgroud)
我想知道是否有可能a将为0.在这种情况下我会使用 a !== null
我的组件中有一个包含a的close函数 setTimeout()以便给动画完成时间.
public close() {
this.animate = "inactive"
setTimeout(() => {
this.show = false
}, 250)
}
Run Code Online (Sandbox Code Playgroud)
this.show 必然是一个 ngIf.
this.animate 绑定动画.
我有一个需要测试此功能的测试
it("tests the exit button click", () => {
comp.close()
fixture.detectChanges()
//verifies the element is no longer in the DOM
const popUpWindow = fixture.debugElement.query(By.css("#popup-window"))
expect(popUpWindow).toEqual(null)
})
Run Code Online (Sandbox Code Playgroud)
如果有的话,你如何正确测试这个功能? setTimeout()?
我正在使用,jasmine.clock().tick(251)但窗户永远不会消失.对此有何想法?