2012-06-11 4 views
0

제대로 연결되는 일부 AJAX 호출을 사용하고 있습니다. 그러나 호출 초기화에서 3 항 연산자를 사용하려고하면 연산자가 올바르게 설정되지 않습니다. 특히, 비동기 매개 변수를 동적으로 설정하려고합니다. AJAX 호출은 사전에 지정되지 않은 한 비동기의 3 진 버전을 수락하지 않습니다. 이것은 Firefox에만 해당됩니다. 다음은 예입니다.AJAX 초기화의 3 진 연산자가 적절하게 설정되지 않음

서버는 async = false;을 지정했는지에 관계없이 비동기 호출을 true로 수신합니다.

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 
    }); 
} 

있지만 삼항 연산자는이 상황에서 작동하지 않습니다 이유를 이해하지 않습니다. 나는 그것이 왜 호출 자체가 아니라 미리 지정 될 필요가 있는지에 대한 설명을 좋아할 것이다.

, 감사합니다 벤

+0

'? :'인수가 주어지면 "(특히 불린의 경우에) 명시 적으로 전달 된 거짓 값이있을 수 있기 때문에 안정적으로 사용할 수 없습니다. – pimvdb

답변

3

귀하의 라인

async: async ? async : true 

... 말한다 : async이 truthy 경우, async를 사용; 그렇지 않으면 true을 사용하십시오. 물론 항상 진실입니다. 당신의 목표는 async이 전혀 주어지지 않는 경우 async: true로 기본 설정하는 경우

,이 작업을 수행 : 그것은 undefined, 또는 true가 아닌 경우라면 async의 값을 사용합니다

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

합니다.


두 번째 버전이 첫 번째 버전과 다르게 동작하지 않는다고 생각합니다. 관측상의 오류라고 생각합니다. |

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); 
    } 
}); 

Live copy :이 코드는 당신이 무슨 일을하는지 에뮬레이션, 항상 true 인 것으로 obj.bar 보여줍니다 source

은 (그것은 두 번째 예   —의 var asyncvar 부분과   — 내 에뮬레이션의 var bar이 무시됩니다 것을주의 아마 가치가있다. 어떤 var가 작성되지 인수를 직접 사용됩니다.)

+0

아아, 물론 그것은 끊임없이 사실로 착륙합니다. 내 감독에 대해 설명해 주셔서 감사합니다 :) – BenR

1

표현은 항상 어떤 truthy 값으로 평가하기 때문에이 발생합니다. 위변조 값을 함수에 전달하면 결국 true$.ajax으로 전달하게됩니다. false에 대해 엄격한 동일성 검사를 사용하면이 문제를 피할 수 있습니다.

시도 async === false ? false : true.

물론, you should never use synchronous XHR requests.