2010-04-08 72 views
5

使用原型1.6.0.2版。原型回調函數吞嚥異常

我有一個常見的問題,當它們被拋出回調函數時,通常當我嘗試處理對Ajax.Request調用的響應時,異常被吞噬。下面是一個簡單的例子:

HTML標記:

<input type="button" id="myButton" value="Press Me" /> 

的Javascript:

MYSITE = {}; 

document.observe("dom:loaded", function() { 

    // Set up our helper object 
    MYSITE.pageHelper = new MYSITE.PageHelper(); 

}); 


MYSITE.PageHelper = function() { 

    console.log("PageHelper called."); 

    $("myButton").observe("click", this.makeCall.bindAsEventListener(this)); 

}; 

MYSITE.PageHelper.prototype.makeCall = function() { 

    console.log("Make call."); 

    new Ajax.Request(
      "remoteCall.cfm", 
      { 
       method: 'get', 
       parameters: "", 
       onComplete: this.handleCallback.bindAsEventListener(this) 

      }); 


}; 

MYSITE.PageHelper.prototype.handleCallback = function(resp) { 

    console.log("Start callback processing..."); 

    var x = missingVar + "text"; // This line generates an exception... 

    console.log("Finished callback processing."); 
}; 

OK,所以問題是,如果你使用Firebug運行在Firefox這段代碼也不例外將被輸出對於違規行 - 它被吞噬了。咕嘟咕嘟。 我知道捕獲這些(如果我正在調試)的唯一方法是在try/catch中包裝回調函數的內容。例如:

MYSITE.PageHelper.prototype.handleCallback = function(resp) { 

    try { 

     console.log("Start callback processing..."); 

     var x = missingVar + "text"; // This line generates an exception... 

     console.log("Finished callback processing."); 

    } catch (e) { 
     console.log(e); 
    } 
}; 

有沒有其他人遇到過這個問題?任何解決方法?

在此先感謝!

回答

4

截至今天,這個被稱爲行爲:

http://groups.google.com/group/prototype-scriptaculous/browse_thread/thread/e71c7a6bfb656380/7d1c8a23edc07f03?lnk=gst&q=exception+swallowed#

有在增強應對這些吞噬例外這裏門票:

https://prototype.lighthouseapp.com/projects/8886/tickets/634-no-exception-on-error-in-oncreate-method-of-ajaxrequest

一個工作 - 周圍建議添加下面的代碼(感謝Glenn Maynard!):

Ajax.Responders.register({ 
     onException: function(request, exception) { 
       (function() { throw exception; }).defer(); 
     } 
}); 

希望能幫助其他人解決同一問題,直到實現更持久的解決方案。

+0

我認爲你引用的代碼只適用於Ajax事件,而不適用於問題已被問及的簡單onClick事件種類。 – 2010-12-11 19:14:22

+0

這是'''解決方案!您應該實現Ajax.Responders - > onException方法,如上所示。 – 2011-03-03 13:48:03

+0

這是非常好的,謝謝你與所有來源很好地鋪設 – febs 2012-08-16 14:16:03