阿余
阿余
  • 发布:2015-10-06 23:59
  • 更新:2016-07-29 11:49
  • 阅读:3714

下载时会Uncaught RangeError: Maximum call stack size exceeded

分类:HTML5+

以下代码在下载时显示下载百分比的代码会报错:Uncaught RangeError: Maximum call stack size exceeded,我的代码仿佛没有进行递归调用呀,如果把case 3 里的代码段注释后下载就不会报错了,不知何故。

function downWgt(wgtUrl) {
console.log(wgtUrl);
var w = plus.nativeUI.showWaiting("   开始下载...  ");
var options = {
filename: "_doc/update/"
};
var dtask = plus.downloader.createDownload(wgtUrl, options, function(d, status) {
if (status == 200) {
console.log("下载wgt成功:" + d.filename);
setTimeout(installWgt(d.filename), 2000); // 安装wgt包
} else {
console.log("下载wgt失败!");
plus.nativeUI.alert("下载更新资源失败!");
}
});
dtask.addEventListener("statechanged", function(task, status) {
switch (task.state) {
case 1: // 开始
w.setTitle("   开始下载...   ");
break;
case 2: // 已连接到服务器
w.setTitle("   开始下载...   ");
break;
case 3:
var a = task.downloadedSize / task.totalSize * 100;
w.setTitle("   已下载" + parseInt(a) + "%   ");
break;
case 4: // 下载完成
w.close();
break;
}
});
dtask.start();
}

2015-10-06 23:59 负责人:无 分享
已邀请:
LFZ

LFZ

解决办法

// 监听上传任务状态  
		var i=0,progress=0;  
		function onStateChanged( upload, status ) {  
			progress=Math.round(upload.uploadedSize/upload.totalSize*100);  
			if(progress==i){  
				i+=5;  
				wt.setTitle("上传中..."+progress+"%");  
			}  
		}
  • 撒网要见鱼

    确实有用!

    顶下!


    2015-11-06 14:21

  • LFZ

    这个是有bug的


    2015-12-03 16:27

撒网要见鱼

撒网要见鱼 - 厚积薄发!

兄弟,我也遇到一样的问题了,不知道你后来是怎么结局的!

gadget2k

gadget2k

同样的问题。我猜测是state=3是频繁发起的,实际上是创造了几十个waiting对象,导致最后堆栈爆仓了。

gadget2k

gadget2k

我现在是页面上设一个label, case 3就更新label的内容,就没这个问题。

阿余

阿余 (作者)

应该组件的BUG吧,我没有处理3状态了。

LFZ

LFZ

我也遇到这个问题
是因为不断刷新

w.setTitle("   已下载" + parseInt(a) + "%   ");

引起的,我也不知道怎么解决。

  • joey1988

    不错


    2015-10-21 10:37

  • joey1988

    回复 joey1988:回到家


    2015-10-21 10:38

  • LFZ

    回复 joey1988:我发了解决办法,你试一试。


    2015-10-21 11:10

  • 小米稀饭大米粥

    哥们这个setTite一次就会有一次的报错,用你这个下面的那个还是有啊?解决了么?


    2016-08-01 16:07

LFZ

LFZ

改良版

// 监听上传任务状态  
				var i = 0,progress = 0;  
				function onStateChanged(upload, status) {  
					if (status != 200) {  
						progress = Math.round(upload.uploadedSize / upload.totalSize * 100);  
						if (progress - i >= 5) {  
							i += progress - i;  
							if (progress == 100) {  
								progress = 99.9  
							}  
							wt.setTitle("上传中..." + progress + "%");  
						}  
					} else if (status == 200) {  
						wt.setTitle("上传中...100%");  
					}  
				}
2***@qq.com

2***@qq.com

只要把
case 3:
var a = task.downloadedSize / task.totalSize * 100;
中的a在循环之外定义就可以了,因为在循环中,重复定义的a太多了。

老醒

老醒

我的是下载文件出现这个问题,我用%10不报错了,%5还是会报少量这个错误,应该还是频繁操作有问题

var prg=0;  
var progress=function (task,status){  
          if(!dtask){return;}  
		switch(task.state) {  
		case 1: // 开始  
	        wt.setTitle( "开始下载..." );  
	        break;  
	        case 2: // 已连接到服务器  
	        wt.setTitle( "链接到服务器..." );  
		break;  
		case 3:	// 已接收到数据  
		prg=parseInt(parseFloat(task.downloadedSize)/parseFloat(task.totalSize)*100);  
		if(prg%10==0){//改成prg%5报错误大概几条  
			wt.setTitle( "已下载"+prg+"%");  
	        }  
	        break;  
	        case 4:	// 下载完成  
			wt.setTitle( "下载完成!" );  
		break;  
		}  
	};  
dtask.addEventListener( "statechanged", progress);
  • 5***@qq.com

    这种方法有时 还会出现卡那的情况呀 请问最后怎么解决的··~?


    2016-09-05 15:12

  • 老醒

    回复 5***@qq.com:没仔细试过,就试了几次,看没报错就当成没问题了...


    2016-11-08 14:00

该问题目前已经被锁定, 无法添加新回复