2016-04-12 11 views
-2

JavaScript'un eval() işleviyle yürütmem gereken bir kod var (Tamam olup olmadığını tartışmak isterseniz eval() işlevini kullanın lütfen bilgi ekleyin Burada: Why is using the JavaScript eval function a bad idea? ama buna odaklanmayın).İstisnasız çalıştıran başka birinin denemesini denedikten sonra deneyin

o eval() fonksiyonu ile yürütülür bazı kod sonra

ve try-catch blokta herhangi istisna verir olmasaydı, bu kod değişir ve başka try-catch bloğunda tekrar eval() işlevi yürütmek zorunda kalacaktır.

Sorunlar, bir try-catch bloğunu diğerinin üzerine koyduğumda, bunların birlikte çalıştırılacağını ve kodun temizlenmeyeceğini, böylece eval() işlevinin iki kez çalıştırılacağını bildirir. Şunun gibi:

var code = some code here; 

try{ 
    eval(code); //Here the code has divs animations 
    $("#animate").promise().done(function(){ 
     checkAnimation(); 
     //Clear code 
    });  
}catch(error){ 
    console.log(error); 
} 

try{ 
    eval(code); //Animations with the same div 

    $("#animate").promise().done(function(){ 
     checkAnimation(); 
    }); 
}catch(error){ 
    console.log(error); 
} 

Ben de bir finally ifade edilmemiş olması gördüm ama Try-catch bloğu bir istisna yaptık ya da değil bu yüzden benim için kullanışlı değildir eğer olursa olsun çalıştırılacaktır. Ben

Ben kodu temizledikten sonra ikinci try-catch blok içerebilir ama iyi bir uygulama olacağını başka fonksiyonu ve kod içinde olduğunu çünkü bilmiyorum düşünüyorum düşünüyorum ne

Bu işlevin içinde de bir istisna oluşturabilir.

Sorum

İlk try-catch blok istisnasız çalıştı sadece try-catch bloğu çalıştırabilir mi?

DÜZENLEME: Kodumu düzenledim çünkü bunu ikinci try-catch'a eklemeyi unutmuştum ayrıca bir animasyon da vardı.

Şimdiden teşekkürler!

+1

İkinci "try..catch" işlevini, "done" geri bildirimin içine koyun ...!? – deceze

+0

@deceze ama daha önce koyduğum gibi kötü bir uygulama olmaz mı? Çünkü 'checkAnimation' işlevi de bir istisna verebilir. –

+0

"Yapılan" geri aramadaki herhangi bir şey ilk "try..catch" bloğunuz tarafından ele alınmaz! Çünkü eşzamansız olarak çalıştırılıyor. Yine de bu geri dönüşün içinde tamamen yeni, bağımsız bir 'try..catch' bloğu kurmak zorunda kalacaksınız. – deceze

cevap

0

, bunu ister çözüldü şu:

var count = 0; 

function evaluateCode(){ 
    try { 
     eval(code); 

     $("#animate").promise().done(function(){ 
      if(count == 0){ 
       checkAnimation1(); //I clear the code inside this function 
      } 
      else{ 
       checkAnimation2(); 
      } 

      count++; 
     });   
    } catch (e) { 
     alert(e); 
    } 
} 

Ve aradım Bu işlev iki kez. Bunu yapmadıysam, kod bir sonraki eval(code)'u çalıştırmadan önce asla temizlemez.

0

done geri çağırma içindeki herhangi bir şey, a) animasyon bittikten sonra yürütülmesi planlanır ve b) bu ​​nedenle dış try..catch bloğundan bağımsız olacaktır. Sen // clear code a) callback'inde içine b) Yeni bir try..catch bloğuna sonra yürütmek istediğiniz herhangi bir kod koymak gerekir: geri arama ilk try..catch bağımsızdır neden nasıl/daha iyi görselleştirmek için

try { 
    eval(code); 
    $("#animate").promise().done(function() { 
     try { 
      checkAnimation(); 
      //Clear code 
      eval(code); 
     } catch (error) { 
      console.log(error); 
     } 
    });  
} catch (error) { 
    console.log(error); 
} 

, yazma yerine satır içi bağımsız bir fonksiyonu olarak geri arama: Son olarak

try { 
    eval(code); 
    $("#animate").promise().done(callback);  
} catch (error) { 
    console.log(error); 
} 

function callback() { 
    try { 
     checkAnimation(); 
     //Clear code 
     eval(code); 
    } catch (error) { 
     console.log(error); 
    } 
} 
+0

Ben koyduğumda ne demek istediğini anladım " _ Sorun şu ki, ikinci try-catch bloğu daha önce başlıyor ..._ çünkü "dediğim gibi kodumu değiştirdim, ama problem hala ikinci" eval (code) "satırından önce yürütülüyor" '// Clear code' 'çalıştırılıyor, böylece ilk kod iki kez, her bir "eval()" işlevinde yürütülüyor. –

+0

Üzgünüm ama bunu ikinci 'try-catch 'bloğuna koymayı unuttum da animasyonlarım var, bu yüzden sanırım ikinci' .done() 'fonksiyonu, div hala hareket ediyor, bu yüzden neden oluyor? Kod temizlenmeden önce yürütülür. Düzenlediğim soruya bak ve tekrar özür dilerim. –

+0

Eh, evet, kodunuzda * hemen * eval 'i ikinci kez çalıştırıyorsunuz. Eğer ilk animasyon bittikten ve kod "temizlendikten" sonra bu yürütmeyi ertelemek istiyorsanız, ** bu “eval” çağrısını asenkronize olan “done” geri çağrısına eklemeniz gerekir. ** – deceze

İlgili konular