我开始使用一个实际上可以顺利运行的JavaScript MMORPG.目前,我创建了一个演示来证明我可以移动角色并让他们互相聊天,以及看到彼此在现场移动.
现在Javascript计时器是我没有广泛使用的东西,但据我所知,如果我错了就纠正我,是否同时发生多个setIntervals并不能很好地运行b/c它只是在一个线程上.
让我们说我希望有10个不同的人通过使用带有setInterval的精灵背景定位来对怪物进行火球训练 - 该动画需要10个setIntervals来重新绘制用于精灵背景位置移位的DOM.那不是一辆大马车吗?
我想知道是否有办法绕过这一切,也许使用Canvas,这样动画可以同时发生而不创建事件队列,我不必担心计时器.
希望有意义,如果我需要进一步澄清,请告诉我.
我在函数中使用以下代码:
setTimeout("doSomething(var1)",10000);
Run Code Online (Sandbox Code Playgroud)
但是,我也var1
可以作为全局变量.10000毫秒后,它会调用本地var1
还是全局var1
?
我想window.setTimeot
用我的自定义范围调用该函数,所以我使用该call
方法,但有一些错误.
function foo() {
this.bar = function() {
console.log("keep going");
window.setTimeout.call(this,this.bar,100);
}
this.bar();
}
new foo;
Run Code Online (Sandbox Code Playgroud)
在Firefox下,这只打印到控制台只有1行,然后什么也没有,在谷歌Chrome下它会抛出一个TypeError
.
我的代码有什么问题?
我正在努力解决下面的代码.我尝试了很多不同的方法,但我最终得到了两个不正确的结果之一.
for(i = 0; i < result.length; i++) {
var tmpBlockInfo = {
size: worldTest.data[0].size,
xStartPixel : result[i].x * worldTest.data[0].size,
yStartPixel : result[i].y * worldTest.data[0].size,
blockType : (Math.random() * 100 > 10) ? 'path' : 'wall'
}
var tmpFunc = function(){
worldTest.fillBlock(tmpBlockInfo, 157, 152, 124, 255)
};
var t = setTimeout(function(){
tmpFunc()
} , 500 * i);
}
Run Code Online (Sandbox Code Playgroud)
上面代码的问题是tmpBlockInfo总是得到最后的结果[i] .x/result [i] .y.因此,当超时运行函数时,我正在假设它看到了什么结果[i] .x/result [i] .y在循环之后保持开启(而不是将其作为"新"变量传递)
我认为将它放入函数会解决闭包问题,但没有运气.
还尝试过:
for(i = 0; i < result.length; i++) {
var tmpBlockInfo = {
size: …
Run Code Online (Sandbox Code Playgroud) 我有一个阵列.我可以用foreach方法循环它.
data.forEach(function (result, i) {
url = data[i].url;
request(url);
});
Run Code Online (Sandbox Code Playgroud)
请求函数正在向给定的URL发出http请求.但是,同时提出所有这些请求会导致各种问题.
所以我认为我应该通过引入某种计时器来减慢速度.
但我不知道如何将forach循环与setTimeOut/setInterval结合起来
请注意我在服务器(nodejs)而不是浏览器上执行此操作.
谢谢你的帮助.
如何从其事件函数内部访问setTimeout/setInterval调用的进程id,因为Java线程可能访问自己的线程ID?
var id = setTimeout(function(){
console.log(id); //Here
}, 1000);
console.log(id);
Run Code Online (Sandbox Code Playgroud) 我正在编写mocha测试用例来测试以下步骤.我打算在调用另一个API之前进行API调用并等待30分钟.我正在使用内部节点API编写调用REST API来编写此测试用例.但由于某种原因,setTimeout
不等待给定的ms.有人可以帮帮我吗?
describe('Checkout - ', function() {
before(function() {
lapetus = test.Lapetus;
});
it('Get purchase contract after session is expired [C123]', function(done) {
this.timeout(180000000);
lapetus.run(function() {
// create customer
......
// create new cart and add one item
......
// create new contract with empty cart id
.......
var pc_id =....;
// wait for 30 minutes for the session to expire
console.log('wait... ' + new Date);
this.setTimeout(getPC(lapetus,pc_id), 18000000);
console.log('ok... ' + new Date);
done();
});
});
var getPC …
Run Code Online (Sandbox Code Playgroud) 我有两个iframe.当页面加载时,iframe1在8秒后加载,我需要在无限循环中显示iframe2替换iframe1.
我尝试了以下代码并将超时设置为8秒和10秒,但iframe1在2秒内更改.
function preview() {
$('#iframe1').hide();
$('#iframe2').show();
setTimeout(function() {
$('#iframe2').hide();
$('#iframe1').show();
}, 8000);
};
setInterval(preview, 10000)
Run Code Online (Sandbox Code Playgroud)
以上也不能顺利加载.如何无缝显示/隐藏它们?
推迟执行函数(例如在自定义事件处理中)是JavaScript中的常见模式(例如,请参见此处).曾经是使用setTimeout(myFunc,0)
是唯一的方法,但是有了承诺,现在有另一种选择:Promise.resolve().then(myFunc)
.
我曾经假设这些几乎可以做同样的事情,但是在处理包含自定义事件的库时,我想我会发现是否存在差异,所以我将以下块放入节点:
var logfn=function(v){return function(){console.log(v)}};
setTimeout(logfn(1),0);
Promise.resolve().then(logfn(2));
logfn(3)();
Run Code Online (Sandbox Code Playgroud)
我期待在控制台上看到3,1,2但是我看到了3,2,1.所以换句话说,Promise并不等同于使用setTimeout并且首先从块中出来.至少在Node中.
我在Chrome和Firefox中重复测试结果相同,但是在Edge中它出现了3,1,2.我还希望非原生的promise库在引擎盖下使用setTimeout,这样就会像Edge一样.
是什么决定了这些来电被解决的顺序?这些不同的环境使用什么模型来确定执行顺序?上述任何一种是否代表标准或非标准行为?
PS我坚决不建议依赖任何这种保持一致,我只是好奇.
在下面给出的答案指出了正确的方向,并且如下面的评论中简要提到的那样,我在Jake Archibald的一篇优秀文章中找到了完整的答案(示例几乎与我上面的代码完全相同),尽管我是加在这里而不是将其隐藏在评论中.
在有关前端工程师性能最佳实践的mozilla文档中,建议结合setTimeout
使用requestAnimationFrame
以在重新绘制后立即运行某些东西:
requestAnimationFrame(() => {
setTimeout(() => {
// This code will be run ASAP after Style and Layout information have
// been calculated and the paint has occurred. Unless something else
// has dirtied the DOM very early, querying for style and layout information
// here should be cheap.
}, 0);
});
Run Code Online (Sandbox Code Playgroud)
为什么这是推荐的解决方案?究竟是什么使它成为在重画后立即安排某些事情的最佳方式?
settimeout ×10
javascript ×9
node.js ×3
setinterval ×3
blocking ×1
browser ×1
call ×1
closures ×1
es6-promise ×1
events ×1
for-loop ×1
iframe ×1
invoke ×1
jquery ×1
loops ×1
repaint ×1
scope ×1
throttling ×1
timer ×1