破的Javascript for循环的回调函数内(Javascript breaking a for

2019-06-26 19:54发布

我有类似下面的代码:

function test(obj) {

    if(//some conditon) {
        obj.onload();
    }else{
        obj.onerror();
    }
}


for(var i=0;i<4;i++){   

    test({
        onload:function(e){          
            //some code to run
        },
        onerror:function(e){
            break;
        }


    });
}

要点是测试()的功能是使一个XHR请求(它实际上是Appcelerator的钛平台的API,所以我有没有对其进行控制),我的东西循环调用测试功能的功能。 我需要上破的onerror函数的循环,但我得到一个错误说破不循环或switch语句。 我该如何改写呢?

Answer 1:

如果您的代码示例确实代表了一些实际的代码(即所有的处理是在同一事件循环打勾做),你可以做到以下几点:

function test(obj) {

    if (some_condition) {
        return obj.onload();
    } else {
        return obj.onerror();
    }
}

var result;
for(var i=0; i<4; i++){   

    result = test({
        onload:function(e){          
            //some code to run
            return true;
        },
        onerror:function(e){
            return false;
        }


    });

    if (!result) {
        break;
    }
}

否则,如果有什么异步做,你必须调用test顺序,而不是平行的。 例如,

function test(obj) {
    doSomeAjaxRequest(arguments, function (err, result) {
        if (some_condition) {
            obj.onload();
        } else {
            obj.onerror();
        }
    });
}

var f = function (i) {
    if (i >= 4) return;
    test({
        onload:function(e){          
            //some code to run
            f(i+1);
        },
        onerror:function(e){
            break;
        }
    });
}

f(0);


Answer 2:

不可能。 for循环是一个同步过程而Ajax请求不是。 这意味着,当使用onerror回调发生,for循环已经执行完毕

作为替代,你可以引入一个检查到您的onSuccess处理这证实任何错误都没有发生过。

var errorOccured = false;
for(var i=0;i<4;i++){   

test({
    onload:function(e){   
        if(errorOccured) return;
        //some code to run
    },
    onerror:function(e){
        errorOccured = true;
    }


});
}


Answer 3:

位哈克也许只有一个可以做这样的事情有一个处理函数。

var handler = function(array, callback){
    for(var i=0, l=array.length, e=array[i]; i<l; ++i){
        if(true === handler.exit){
            handler.exit = false; //restore
            return;
        }
        callback.call(null, e);
    }
};
handler.exit = false; 

handler([1,2,3], function(e){
   console.log(e);
   if(2 === e){
       arguments.callee.caller.exit = true; // :-)
   }
});

没有测试这一点,但也许你可以在调用绑定功能范围甚?

var handler = function(a, f){
    this.exit = false;
    for(var i=0, l=a.length, e=a[i]; i<l; ++i){
        if(true === this.exit){
            this.exit = false; //restore
            return;
        }
        callback.call(this, e);
    }
};
handler([1,2,3], function(e){
   console.log(e);
   if(2 === e){
       this.exit = true;
   }
});


Answer 4:

你不能打破内部测试()函数的循环。 我认为,在这种情况下,最好的办法是扔掉内部测试()函数的异常,然后抓住它的循环,并打破。



Answer 5:

也许你可以使“为onload”回调递归?

意思是,你刚才所说的“的onload” handlerr里面的“测试”的方法,这将也意味着你火的同时,以代替所有的所有请求。



Answer 6:

我拿penartur的答案,但我修改没有“休息”:

function test(obj) {
    doSomeAjaxRequest(arguments, function (err, result) {
        if (some_condition) {
            obj.onload();
        } else {
            obj.onerror();
        }
    });
}

var f = function (i) {
    if (i >= 4) return;
    test({
        onload:function(e){          
            //some code to run
            f(i+1);
        },
        onerror:function(e){
            console.log('stop');
        }
    });
}

f(0);


文章来源: Javascript breaking a for loop inside a callback function