Javascript – setTimeout关闭问题

我正在努力解决下面的代码.我尝试了很多不同的方法,但我最终得到了两个不正确的结果之一.
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);
}

上面代码的问题是tmpBlockInfo总是得到最后的结果[i] .x / result [i] .y.因此,当超时运行函数时,我正在假设它看到什么结果[i] .x / result [i] .y在循环之后保持开启(而不是将其作为“新”变量传递)

我认为将它放入函数会解决闭包问题,但没有运气.

还尝试过:

for(i = 0; i < result.length; i++) {

    var tmpBlockInfo = {
        size: worldTest.data[0].size,blockType : (Math.random() * 100 > 10) ? 'path' : 'wall'
    }

    var t = setTimeout(function(){
        worldTest.fillBlock(tmpBlockInfo,255)
    },10000 * i);
}

与第一个代码具有相同的结果.

如果我做:

for(i=0; i < result.length; i++) {

    var tmpBlockInfo = {
        size: worldTest.data[0].size,blockType : (Math.random() * 100 > 10) ? 'path' : 'wall'
    }

    setTimeout(function(passBlockInfo) {
        worldTest.fillBlock(tmpBlockInfo,255) 
    } (tmpBlockInfo),1000 * i);
}

它确实正确处理所有fillBlock函数.但它同时完成所有这些操作(例如,它不是一次一个地触发它们.它只是在彼此之后执行它们但导致阻塞(没有屏幕更新)并且每个之间没有延迟.

任何帮助都会很棒!

解决方法

原因是它正在执行它们是因为您正在执行setTimeout调用中的函数.我要做的是创建另一个这样的函数
function MakeTimeoutCall(fn,data,timeout){
    setTimeout(function() {fn.call(null,data);},timeout);
}

然后在你调用setTimeout的循环中,执行此操作

MakeTimeoutCall(
    function(passBlockInfo){
       worldTest.fillBlock(passBlockInfo,255);
    },tmpBlockInfo,1000 * i);

(假设worldTest是一个全局对象).

这应该工作. setTimeout期望一个函数在超时结束时调用,你给你的函数,但是马上调用它.返回值(在本例中为null)将被赋予超时.所以没有超时,一切都发生了.

为了防止上下文我的答案有点复杂,here是jsfiddle中更简单解决方案的链接.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


kindeditor4.x代码高亮功能默认使用的是prettify插件,prettify是Google提供的一款源代码语法高亮着色器,它提供一种简单的形式来着色HTML页面上的程序代码,实现方式如下: 首先在编辑器里面插入javascript代码: 确定后会在编辑器插入这样的代码: <pre
这一篇我将介绍如何让kindeditor4.x整合SyntaxHighlighter代码高亮,因为SyntaxHighlighter的应用非常广泛,所以将kindeditor默认的prettify替换为SyntaxHighlighter代码高亮插件 上一篇“让kindeditor显示高亮代码”中已经
js如何实现弹出form提交表单?(图文+视频)
js怎么获取复选框选中的值
js如何实现倒计时跳转页面
如何用js控制图片放大缩小
JS怎么获取当前时间戳
JS如何判断对象是否为数组
JS怎么获取图片当前宽高
JS对象如何转为json格式字符串
JS怎么获取图片原始宽高
怎么在click事件中调用多个js函数
js如何往数组中添加新元素
js如何拆分字符串
JS怎么对数组内元素进行求和
JS如何判断屏幕大小
js怎么解析json数据
js如何实时获取浏览器窗口大小
原生JS实现别踩白块小游戏(五)
原生JS实现别踩白块小游戏(一)