0

我正在处理一些正确连接的 AJAX 调用,但是如果我尝试在调用初始化中使用三元运算符,则运算符设置不正确。具体来说,我正在尝试动态设置 async 参数。除非事先指定,否则 AJAX 调用拒绝接受异步的三元版本。这是 Firefox 特有的。这是一个例子:

无论我是否指定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: truewhenasync根本没有给出,请执行以下操作:

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

这将使用asyncif it's notundefinedtrueif it is 的值。


恕我直言,我认为第二个版本与第一个版本没有什么不同,我认为这一定是观察错误。此代码模拟您正在做的事情,并始终显示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);
  }
});

现场复制| 来源

(可能值得注意的是,您的第二个示例中的部分 - 以及我对它的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 回答