2

私はこのjsonp関数を持っています:

    function jsonp(url, callback) {
    var script = document.createElement("script");
    script.setAttribute("type","text/javascript");
    script.setAttribute("onerror","javascript:DisplayPopUp('','staleExceptionRefresh')");
    script.setAttribute("src", url + questionMark + "accept=jsonp&callback="+callback + "&cachebuster="+new Date().getTime());
    document.getElementsByTagName("head")[0].appendChild(script);
}

私はこのような成功イベントをキャッチします:

function someCallbackFunction(data1, data2) {}

しかし、問題は、404または409またはその他のサーバーエラーが発生した場合、それらをキャッチする方法がわからないことです(それらはに表示されませんsomeCallbackFunction)。

何かを表示する属性を設定できonerrorますが、サーバーの応答をキャッチするにはどうすればよいですか。

これは、通常のコールバック関数ではキャッチできないサーバー応答の例です。

DeleteWebsiteAjaxCall({"action":"", "type":"", "callerId":""}, {errorDescription: "important description I want to display","success":false,"payload":null});

関数でこれらのエラー(古い例外?!)をキャッチするにはどうすればよいですか?

4

1 に答える 1

2
function jsonp(url, callback) {
    var script = document.createElement("script");
    script.setAttribute("type","text/javascript");
    script.setAttribute("src", url + questionMark + "accept=jsonp&callback="+callback + "&cachebuster="+new Date().getTime());
    var errHandler = function(evt) {
      clearTimeout(timer)
      // reference to http://www.quirksmode.org/dom/events/error.html
      // you will get an error eventually, and you can call callback manually here, to acknowledge it.
      // but unfortunately, on firefox you can get error type as undefined, and no further detail like error code on other browser either. 
      // And you can tell the callback function there is a net error (as no other error will fire this event.)
      window[callback](new Error());
    };
    script.onerror = errHandler;
    script.onload = function() {
      clearTimeout(timer);
    }
    // also setup a timeout in case the onerror failed.
    document.getElementsByTagName("head")[0].appendChild(script);
    var timer = setTimeout(errHandler, 5000);
}

404/409が発生したときにサーバーが応答する場合は、代わりに200ステータスコードをクライアントに送信して、スクリプトを評価します。

それ以外の場合、ブラウザはサーバーの応答を省略し、onerrorイベントを発生させます。

于 2012-11-14T12:20:10.057 に答える