JS 越跑越卡 一会儿就卡死了

2015-11-13 16:43:24 +08:00
 m939594960
function  goto()
    {
        var _this=$('.urls span.url').eq(0);
        var b = new Base64();
        $('#cai_web').attr('src',"/cai_content/"+b.encode (_this.html())+'-'+_this.attr('data-gid')+'-'+'{{ $id }}');
        $('#cai_web').load(function()
        {
            _this.appendTo('.urls .item .ok');
            if (go==true){
                goto();
            }
        });
    }

做采集的时候 需要用到的 JS 但是发现这个段 JS 越跑越卡 一会儿就卡死了
哪个地方有问题? 该如何解决呢?

3224 次点击
所在节点    问与答
28 条回复
penjianfeng
2015-11-13 16:57:51 +08:00
你的变量 go 呢?一直 true ?
m939594960
2015-11-13 17:02:58 +08:00
@penjianfeng
就是跑一条 扔一条 然后继续跑 让他一直跑下去
go 这个变量 当点击停止按钮之后就会变成 false
CodingPuppy
2015-11-13 17:14:59 +08:00
哪里跑一条仍一条了?都在内存里
m939594960
2015-11-13 17:18:09 +08:00
@CodingPuppy
比如 一共 100 条 url 放到一个 div 里
取一个 url 然后 iframe 传 encode 的 url 到后台
然后等待 iframe 加载完成 吧这个 url 传到另一个容器里
继续执行相同的动作

现在问题就是跑到第 19~20 条 浏览器就崩溃了
jasontse
2015-11-13 17:18:11 +08:00
@m939594960
上一个 goto 没结束就套下一个 goto ,哪里跑一条扔一条了。
lucky2touch
2015-11-13 17:19:43 +08:00
手机上回了两次没成功,上面说得很清楚了,没有释放......
m939594960
2015-11-13 17:21:48 +08:00
@jasontse goto 后面没有代码了 应该算结束了吧 要 retrun ''去结束么?
@lucky2touch 怎么释放呢? 谢谢!
learnshare
2015-11-13 17:32:56 +08:00
递归地在跑吧,没有释放什么东西
kokdemo
2015-11-13 17:41:05 +08:00
……这么简单的效果用 settimeout 会不会好一点?
m939594960
2015-11-13 17:45:30 +08:00
@learnshare 这种情况不能用递归么。 应该去用 while ??
@kokdemo 得网站加载完毕后 在加载另一个 iframe 啊
m939594960
2015-11-13 17:45:45 +08:00
@kokdemo 得一个 iframe 加载完毕后 在加载另一个 iframe 啊
kokdemo
2015-11-13 17:47:27 +08:00
@m939594960 可以循环的检测 iframe 的状态
检测加载完成,就触发下一个 iframe
m939594960
2015-11-13 17:48:28 +08:00
@kokdemo 嗯我尝试一下 应该是可以得 但是总想找个完美的方法
sunjourney
2015-11-13 17:50:07 +08:00
这是学过递归还是没学过呢,出口在哪里?用循环加 flag 控制,另外你的 Indentation 是什么教派的?
otakustay
2015-11-13 18:06:41 +08:00
楼主的各位,这货似乎不是个递归,有个异步+callback 在里面……
m939594960
2015-11-13 18:08:28 +08:00
@sunjourney 缩进 是在复制的时候出了一些小问题 现在找到几种方法了 while 或者 settimeout 但是我还是不懂为什么我这么写不行 。。 求教谢谢
bdbai
2015-11-13 18:17:08 +08:00
每次回调都会保留作用域 开调试器检查一下
LancerComet
2015-11-13 18:26:18 +08:00
go == true ? setTimeout(goto, 1) : void(0);

楼主试试:
```
var i = 0;
function a (param) {
param = param || 0;
console.log("a" + param);
if (i < 3) {
a(1);
i++;
}
console.log("a() executing finished.");
}
```

```
var i = 0;
function a (param) {
param = param || 0;
console.log("a" + param);
if (i < 3) {
setTimeout(a.bind(0, i), 1);
i++;
}
console.log("a() executing finished.");
}
```
LancerComet
2015-11-13 18:33:50 +08:00
@m939594960
楼主这么写的行为: goto 还没有退出就在 goto 内再次执行 goto
加了 setTimeout 后的行为:向任务队列登记一个新的计时器任务后退出 goto.
HunterPan
2015-11-13 19:14:58 +08:00
你这个用法会不会造成栈溢出啊 有点递归( js 不大懂)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/235991

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX