2012-06-11 60 views
0

我正在使用一些AJAX調用,它們可以正確連接,但是如果我嘗試在調用初始化時使用三元運算符,則操作員設置不正確。具體來說,我試圖動態設置異步參數。除非事先指定,否則AJAX調用拒絕接受異步的三進製版本。這是Firefox特有的。以下是一個示例:AJAX初始化中的三元運算符未正確設置

服務器接收異步調用爲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 
    }); 
} 

雖然代碼工作時,我事先指定它,我不明白爲什麼一個三元運營商不會在這種情況下工作。我很想解釋爲什麼需要事先指定而不是在通話本身。

謝謝 本

+0

'? :「如果給出參數,不能可靠地使用」,因爲可能會顯式傳遞錯誤值(特別是在布爾值的情況下)。 – pimvdb

回答

3

你行

async: async ? async : true 

...說:如果async是truthy,使用async;否則,請使用true。所以當然這總是很有道理。

如果你的目標是當async完全不給默認爲async: true,這樣做:

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

將使用的async的值,如果它不是undefined,或者true如果是。


所有應有的尊重,我不認爲第二個版本做任何事情不同的第一個版本,我想那一定是觀測誤差。此代碼模擬你在做什麼,並始終顯示obj.bartrue

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 | source

(這也許值得一提的是,var async在你的第二個例子  —的var一部分,我對它的  —仿真的var bar被忽略。不創建var,該參數直接使用。)

+0

啊,當然,它會作爲一個真正的土地。感謝您對我的監督的澄清:) – BenR

1

這是因爲表達將始終評估爲一些truthy值。如果您將虛假值傳遞給您的函數,則最終會將true傳遞給$.ajax。您可以使用嚴格的相等性檢查false來避免此問題。

嘗試async === false ? false : true。當然,you should never use synchronous XHR requests