2

YUI チームから提供されたサンプル コードを少し変更して使用しています。ソースが JSON 以外の応答を返す (または単に JSON 構文エラーがある) 場合、ブラウザー (Safari) はスクリプト処理を中止し、問題があったことをユーザーに通知できません。

私は絶対に JS の第一人者ではないので、このコードは必要以上に醜いかもしれません。コードは、おおよそ次のとおりです。

YUI().use("dump", "node", "datasource-get", "datasource-jsonschema", function(Y) {
  var myDataSource = new Y.DataSource.Get({
    source:"/some/json/source/?"}),
    myCallback = {
      success: function(e){
        myResponse = e.response;
        doSomething(myDataSource);
      },
      failure: function(e){
        Y.get("#errors").setContent("<li>Could not retrieve data: " + e.error.message + "</li>");
      }
    };

  myDataSource.plug(Y.Plugin.DataSourceJSONSchema, {
    schema: {
      resultListLocator: "blah.list",
      resultFields: ["user", "nickname"]
    }
  });
  myDataSource.sendRequest("foo=bar", myCallback);
}

「var myDataSource」ブロックを try/catch でラップしてみました。また、YUI().use() ブロック全体をラップしてみました。

構文エラーをキャッチすることは可能ですか? オールインワンの DataSource.Get 呼び出しを個別の IO 呼び出しと解析呼び出しに置き換える必要がありますか?

4

3 に答える 3

1

問題はおそらく、YUI が失敗を報告する前に、ブラウザー (Javascript 解析) のあるレベルでエラーが発生することです。

window.onerror を実装していない Safari では、この種のエラーを検出するのは非常に困難です。私のJavascript ライブラリ bezen.orgでより多くのエラーをキャッチするために、非同期コードがトリガーされる場所に try/catch を追加しました。

  • 動的スクリプトの読み込み (JSON ダウンロードと同等)
  • setTimeout/setTimer: エラーをログに記録する try/catch を挿入するために、これらのブラウザ関数をラップして置き換えました

対応するモジュールのソース コードを確認することに興味があるかもしれません。これは、問題を解決するためのヒントとして、またはそのまま役立つ場合があります。

  • bezen.dom.js appendScript メソッドで safelistener を探す
  • bezen.error.js safeSetTimeout/safeSetInterval と catchError をチェック
于 2009-11-24T22:51:10.873 に答える
1

ローカル スクリプトを要求しているため、try/catch 内で Y.io + Y.JSON.parse を使用するか、Y.DataSource.IO + Y.DataSchema.JSON (+ Y.JSON) を使用できます。

DataSource.Get の利点は、Same Origin ポリシーを回避できることです。ただし、安全性と柔軟性が低くなります。必要がない場合は、使用を避ける必要があります。

DataSource.Get の契約は、サーバーが JSONP をサポートすることです。これが機能する方法は、Get が src=(指定した URL)&callback=someDataSourceFunction を使用してスクリプト ノードをページに追加することです。

ブラウザはその URL でリソースをリクエストし、次の 2 つのいずれかが発生します。

  1. サーバーは、someDataSourceFunction({"all":"your data"}); の形式の JavaScript 文字列で応答します。また
  2. サーバーは、JavaScript として解析できないテキストを返します。

どちらの場合も、その文字列はスクリプト ノードの内容として扱われ、解析されて実行されます。解析できない場合、ブラウザはエラーをスローします。これを止めることはできません。JSONP は技術的に真の JSON の仕様上の制約を受けていませんが (無効な JSON であっても解析して実行する必要があります)、常に純粋な JSON を使用し、常にサーバー側のライブラリを使用して JSON 出力を生成する必要があります ( http://json.考えられるすべての言語のライブラリのリストについては、orgを参照してください)。JSON をハンドロールしないでください。何時間ものデバッグにつながるだけです。

于 2009-11-25T01:15:49.253 に答える
0

「何かをする」前にこれを試してみてください:

try
{
   var test = YAHOO.lang.JSON.parse(jsonString); 
   ...
}
catch (e)
{
   alert('invalid json');
}
于 2009-11-24T21:28:49.263 に答える