javascript - Jquery:$.when 根据参数的数量表现不同

标签 javascript jquery jquery-deferred

$.when 的行为会有所不同,具体取决于是否将一个或多个 Deferred 对象传递给它。此行为记录在文档中 - 但问题是它迫使我编写两个不同的代码路径。

function foo (dfds) {
    $.when.apply(this, dfds).done(function() {
        console.log(arguments);
    });
}

案例一:

foo([$.getJSON("http://freegeoip.net/json/8.8.8.8"),
     $.getJSON("http://freegeoip.net/json/8.8.8.9")]);
....
/* Output (what I'd come to expect) */
[Array[3], Array[3]]

案例二:

foo([$.getJSON("http://freegeoip.net/json/8.8.8.8")]);
....
/* Output (the original unwrapped deferred's arguments) */
[Object, "success", Object]

有什么方法可以在不检查 dfd 的长度或 arguments 的类型的情况下优雅地处理这个问题?

最佳答案

我认为您无法避免显式测试延迟对象的数量。假设您要返回延迟的对象:

function foo (dfds) {
    if(dfds.length > 1) {
        return $.when.apply(this, dfds);
    }
    else {
        return dfds[0].pipe(function() {
            return [Array.prototype.slice.call(arguments, 0)]
        });
    }
}

您可以创建一个 jQuery 插件来包装此功能并使其可重用:

(function($) {
    $.when_ = function() {
        if(arguments.length > 1) {
            return $.when.apply(this, arguments);
        }
        else {
            return arguments[0].pipe(function() {
                return [Array.prototype.slice.call(arguments, 0)];
            });
        }
    };
}(jQuery));

您也可以覆盖 $.when 但我不确定它是否在内部使用。

关于javascript - Jquery:$.when 根据参数的数量表现不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12050160/

相关文章:

javascript - 在 jQuery 中用 TAB 键代码替换 Enter 键代码

javascript - 将函数传递给 Deferred 的构造函数的优点/缺点

jquery-deferred - 是否可以重置 jQuery 延迟对象状态?

javascript - 将延迟处理程序附加到函数外部的嵌套 AJAX 调用

javascript - 单击 Jquery 更改跨度

javascript - 必须为内部事件指定默认脚本语言

javascript - 有没有 jQuery scrollTop 的替代品?

javascript - 如何使用 jquery 在点击时切换框阴影

jquery - 子div位置绝对父高度不起作用

javascript - 动态创建嵌套 JSON 对象父级和子级