0

適切に接続するいくつかの AJAX 呼び出しを使用していますが、呼び出しの初期化で三項演算子を使用しようとすると、演算子が正しく設定されません。具体的には、非同期パラメーターを動的に設定しようとしています。AJAX 呼び出しは、事前に指定されていない限り、非同期の 3 値バージョンの受け入れを拒否します。これは Firefox に固有のものです。次に例を示します。

を指定したかどうかに関係なく、サーバーは非同期呼び出しを true として受け取りますasync = false;

function(url, type, async) {
    $.ajax({
        url: url,
        type: type,
        async: async ? async : true
    });
}

正しく動作します:

function(url, type, async) {
    var async = async ? async : true;
    $.ajax({
        url: url,
        type: type,
        async: async
    });
}

事前に指定するとコードは機能しますが、この状況で三項演算子が機能しない理由がわかりません。呼び出し自体ではなく、事前に指定する必要がある理由について説明したいと思います。

ありがとう、ベン

4

2 に答える 2

3

あなたのライン

async: async ? async : true

...言う: が真実である場合は、 ;asyncを使用します。asyncそれ以外の場合は、を使用しますtrue。もちろん、それは常に真実です。

がまったく指定されていないasync: trueときにデフォルトにすることが目標である場合は、次のようにします。async

async: typeof async === "undefined" ? true : async

asyncそうでない場合undefined、またはそうである場合は、の値を使用しますtrue


敬意を表しますが、2 番目のバージョンが最初のバージョンと何か違うことをするとは思いません。それは観測エラーに違いないと思います。このコードは、実行していることをエミュレートし、常に次のように表示obj.barされtrueます。

jQuery(function($) {

  function foo1(bar) {
    var obj = {
      bar: bar ? bar : true
    };
    display("(1) obj.bar = " + obj.bar);
  }

  function foo2(bar) {
    var bar = bar ? bar : true;
    var obj = {
      bar: bar
    };
    display("(2) obj.bar = " + obj.bar);
  }

  foo1(false);
  foo1(true);
  foo2(false);
  foo2(true);

  function display(msg) {
    $("<p>").html(String(msg)).appendTo(document.body);
  }
});

ライブコピー| ソース

(おそらく、2 番目の例のvar部分と、それをエミュレートした部分が無視されることに注意してください。いいえが作成され、引数が直接使用されます。)var asyncvar barvar

于 2012-06-11T17:31:21.543 に答える
1

これは、式が常に何らかの真の値に評価されるために発生します。関数に偽の値を渡すと、 に渡すことになりtrueます$.ajax。に対して厳密な等価性チェックを使用することで、この問題を回避できますfalse

試してみてくださいasync === false ? false : true

もちろん、同期 XHR リクエストは絶対に使用しないでください

于 2012-06-11T17:31:06.567 に答える