2012-03-08 25 views
12

jQuery'ye iletilen geri aramalardan (click gibi olay işleyicilerine veya then veya always gibi jqXHR yöntemlerine) alınan istisnaları yakalamak istiyorum.jQuery'ye iletilen geri çağrılarda atılan istisnalar nasıl yakalanır?

Ben iki seçenek belirledik:

  • window.onerror işleyicisi - Bu her callback'inde içinde
  • elleçleme istisnalar benim hedef platformlarından biri olan bu Android'de desteklenmediği için yalnızca kısmi bir çözüm - hiç de değil!

Düşünebildiğim tek şey, jQuery yöntemlerini geçersiz kılar ancak jQuery'yi her yüklediğimde sorunlara neden olabilir. AJAX işleyicileri için $ .ajaxSetup (Exceptions thrown in jQuery AJAX callbacks swallowed? cevabına göre) kullanabiliyordum ama bunun her şeyi yakalamamı sağlayacağından emin değilim.

Başka seçenek var mı? Bunun yerine, gerçek geri arama geçme, bir Ajax çağrısına bir geri arama geçmek giderken

function cbWrapper(fn) { 
    return function() { 
     try { 
      return(fn.apply(this, arguments)); 
     } catch(e) { 
      // handle all your exceptions here 
     } 
    }; 
} 

Yani, cbWrapper(callback) geçmesi:

cevap

15

Aşağıdaki gibi her geri arama sarabilirsiniz.

$.get(url, cbWrapper(myRealCallback)); 

Veya satır içi anonim versiyonu böyle olacağını:

$.get(url, cbWrapper(function() { 
    // actual callback code here 
})); 

Daha gelişmiş otomatik geri arama sarar, kendi uygulama ile $.get() geçersiz olacaktır yapmanın yolu, ama bu zor alır jQuery, argümanların gerçekte ne olduğu konusunda çok esnek olduğu için. Bu nedenle ve bu çalışmayı yapmak için belirli bir bağımsız değişkeni geçersiz kılmanız gerektiğinden, hangi argümanların mevcut olduğunu ve hangi gerçek işlev parametrelerine karşılık geldiğini belirleyen tüm argüman algılama kodlarını çoğaltmanız gerekir. Bu kod biraz dağınık. Bu yapılabilir ve muhtemelen kırmayacak çünkü jQuery bozulduysa, mevcut jQuery kodu kırılacak, ama çok temiz değil. hepsi kendi kod ise

, sadece argüman pozisyonları ile çok esnek değildir $.get() kendi versiyonunu yapmak ve tüm kodu fiili $.get() yerine kullanmak için geçiş olabilir:

jQuery.fn.myGet = function(url, fn) { 
    return(jQuery.get(url, cbWrapper(fn))); 
} 
İlgili konular