在原生js中,函数内部的for循环,我们可以利用return终止循环并停止循环后面的代码执行,如下
而在jq的$.each()的遍历中,return可以跳过当前的一次循环,return false则可以终止循环,但是它们都无法阻止循环之后的代继续执行码。
但是有时候我们确实要在遍历达成某种条件时既结束遍历,又终止之后的代码继续执行,怎么做呢?之前我是这么做的,加个变量做判断。
这样当然是可以达到想要的效果的,但是如果函数里有不止一个遍历,判断条件各不相同,我们可能就要加很多的变量,这样代码写起来就会感觉很混乱。所以我就考虑是否还有别的办法去终止代码执行呢?终止代码,当然首先想到的就是throw,手动抛错
这样看起来效果是达到了,但是控制台上一个鲜红的X似乎不是我们想看到的,毕竟这是手动抛错,是属于可控的异常,不需要用这种方式来提醒。
接下来用window.onerror来控制一下报错提示,并对throw方法进行包装。
var myThrow={
_init(){
window.onerror=function(msg,url,line,col,err){
if(err.type && err.type=='myerr'){
console[err.level](err)
return true;
}
}
},
myError:function(errMsg,errLevel){
this.msg=errMsg
this.level=errLevel
this.type='myerr'
},
_throw(msg,level){
var myError=new this.myError(msg,level);
throw myError;
},
_act(msg,level){
myThrow._init();
this._throw(msg,level)
},
log(msg,level){
this._act(msg,'log')
},
warn(msg,level){
this._act(msg,'warn')
},
error(msg,level){
this._act(msg,'error')
}
}
function jqList(){
$.each([1,2,3,4,5,6],(i,t)=>{
if(i==3){
myThrow.warn('出错了')
}
console.log(i)
})
console.log('看到这一行说明终止无效')
}
jqList()
调用时分别使用 myThrow.log、myThrow.warn、myThrow.error 来输出报错的级别,效果如下
----------------------------------------------------------------------------------------------------------------------
myThrow.log('出错了')
----------------------------------------------------------------------------------------------------------------------
myThrow.warn('出错了')
----------------------------------------------------------------------------------------------------------------------
myThrow.error('出错了')
----------------------------------------------------------------------------------------------------------------------
由于在window.onerror里对错误的type属性进行了区别,所以这种自定义报错只在myThrow的方法下产生作用,对其他的由浏览器抛出的错误不会造成影响。
这样就实现了终止代码,同时对抛错的级别进行控制。
如果有其它的比较好的实现办法,欢迎留言指正。