2012-08-07 33 views
9

अंदर पाश के लिए एक को तोड़ने के बाद:जावास्क्रिप्ट मैं की तरह कोड है एक कॉलबैक फ़ंक्शन

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 अनुरोध करने के लिए एक समारोह है (यह वास्तव में के एक एपीआई है एपसेलरेटर टाइटेनियम प्लेटफ़ॉर्म इसलिए मेरे पास इसका कोई नियंत्रण नहीं है) और मैं परीक्षण फ़ंक्शन को कॉल करने के लिए कुछ लूप कर रहा हूं। मुझे आतंकवादी फ़ंक्शन पर लूप को तोड़ने की ज़रूरत है, लेकिन मुझे एक त्रुटि मिल रही है कि ब्रेक एक लूप या स्विच स्टेटमेंट के अंदर नहीं है। मैं इसे कैसे लिख सकता हूं?

+1

धन्यवाद मैं केवल अतीत में जवाब देने के मतदान लेकिन अब मैं जाँच चिह्न हिट करने के लिए पता – eirikrl

उत्तर

11

अपने कोड नमूना (यानी सभी प्रसंस्करण एक ही घटना पाश टिक में किया जाता है) कुछ वास्तविक कोड का प्रतिनिधित्व करता है, तो आप निम्न कर सकते हैं एसिंक्रोनस किया गया, आपको अनुक्रमिक रूप से 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); 
0

आप परीक्षण() फ़ंक्शन के अंदर लूप को तोड़ नहीं सकते हैं। मुझे लगता है कि इस मामले में सबसे अच्छा समाधान टेस्ट() फ़ंक्शन के अंदर अपवाद फेंकना होगा, फिर इसे लूप और ब्रेक में पकड़ लें।

2

संभव नहीं है। ए लूप एक सिंक्रोनस प्रक्रिया है जबकि अजाक्स अनुरोध नहीं है। इसका मतलब है कि जब आतंक कॉलबैक होता है, तो लूप पहले से ही निष्पादित किया जाता है।

एक विकल्प के रूप में आप अपने ऑनस असफलर में एक चेक पेश कर सकते हैं जो पुष्टि करता है कि अभी तक कोई त्रुटि नहीं हुई है।

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; 
    } 
} 

अन्यथा, अगर वहाँ कुछ है:

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; 
    } 


}); 
} 
0

शायद आप 'ऑनलोड' कॉलबैक रिकर्सिव कर सकते हैं?

मतलब, आप 'ऑनलोड' हैंडलर के अंदर 'टेस्ट' विधि को कॉल करते हैं, इसका मतलब यह भी होगा कि आप सभी अनुरोधों को एक ही समय में क्रमशः आग लगाना चाहते हैं।

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; 
    } 
}); 
0

मैं 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);