2

これは本当に私を困惑させます。なぜこれが起こっているのでしょうか?

このコードは動作します:

 $.ajax({
            type: 'GET',
            dataType: 'json',
            url: 'http://localhost:3235/Users/searchUsers?callback=?&searchString=' + searchString,
            success: alert("Success")
        });

このコードは次のことを行いません。

 $.ajax({
            type: 'GET',
            dataType: 'json',
            url: 'http://localhost:3235/Users/searchUsers?callback=?&searchString=' + searchString,
            success: function(data){
              alert("Success");
            }
        });
4

4 に答える 4

4

最初のスニペットは不適切な構文であり、使用すべきではありません。成功時ではなく、すぐに呼び出されるため、アラートが発生します。

2 番目のスニペットでアラートを受け取らない理由は 2 つだけです。

  1. サーバーが成功ステータス コードを返していません。たとえば、200 ではなく、404、500 などです。
  2. 唯一の他の可能性は、返された jsonp が jsonp ではないか、有効な jsonp ではないことです。

JSONP と JSON を混同している可能性が高いので、それぞれの例を示します。最初はjsonです:

{"foo":"bar"}

これは JSONP...?callback=somecallbackname&...です:

somecallbackname({"foo":"bar"})

jQuery によって提供されることに注意しsomecallbacknameてください。コールバック get パラメータの値を取得し、それを使用して JSONP を適宜生成する必要があります。

于 2013-05-02T17:42:05.140 に答える
2

最初のものは、コードのバグのために「機能」します。アラートを呼び出し、成功のコールバックに返されるものを保存しています。

エラー ハンドラを追加して、実際の問題を確認します。

 $.ajax({
            type: 'GET',
            dataType: 'json',
            url: 'http://localhost:3235/Users/searchUsers?callback=?&searchString=' + searchString,
            success: function(data){
              alert("Success");
            },
            error: function (xhr, status, msg) {
              console.log(status, msg);
            }
        }); 

エラーハンドラを起動できない場合。JavaScript コンソールの net タブを見て、http リクエストを見てください。サーバーが返すエラーが表示されます。

于 2013-05-02T17:39:49.477 に答える
0

最初の例は間違っています - の結果はalert("Success")関数ではなくコールバックとして割り当てられます。

2 番目の例は近いですが、JSON と JSONP を混同しています。サービスが JSON を返す場合はcallback=?、リクエスト URL から削除する必要があります (実際、これは関係なく削除できます。設定dataType:'jsonp'により自動的に追加されます)。

var ajax_url = 'http://example.com:3235/Users/searchUsers?searchString=' + searchString;

$.ajax({
    type: 'GET',
    dataType: 'json',
    url: ajax_url,
    success: function(data){
        alert("Success");
    },
    error: function(xhr, status, error){
        alert("Error: " + status + " " + error);
    },
    complete: function(xhr, status){
        alert("Complete: " + status);
    }
});
于 2013-05-02T17:52:25.427 に答える
0

最初のコード スニペットから得られるアラートは誤解を招くものです。

がプロパティalert("Success")に割り当てられると、success実際にすぐに呼び出します。

2番目のアプローチは、あなたが望むものです。

于 2013-05-02T17:42:11.117 に答える