1

我有以下标记和脚本:

<div id="output" hidden>
    <img src="ajax-loader.gif" />
</div>
<script src="Scripts/jquery.min.js"></script>
<script>
    var promises = [
        $.getJSON("./MyContacts.js"),
        $("#output").fadeIn("slow"),
            new $.Deferred(function (dfd) {
                setTimeout(dfd.resolve, 5000);
                return dfd.promise;
        })
    ];

    $.when(promises).then(
        function (xhr, faded, timer) {
            faded.html(xhr[0].length + " Contact(s) Found");
        },
        function (xhr, status) {
            $('#output').html("Error retrieving contacts.")
        }
    );
</script>

运行代码时,我收到一条错误消息:

UncaughtTypeError:无法调用未定义的方法“html”

是什么导致了这个错误?

4

1 回答 1

2

$.when()不期望一个ArrayDeferreds,而是将每个作为他们自己的论点。

由于它本身Array不是一个Deferred,它被视为一个真实的自动解析。而且,faded不是您选择undefined的,因为实际上拥有一切。$("#output")xhr

console.log(xhr);
// Array( [jqXHR], [jQuery], [Promise] )

您将要使用.apply()传递promises给它:

$.when.apply($, promises).then(/* ... */);

或者,为了将来参考(ES6),使用价差:

$.when(...promises).then(/* ... */);

另外,请注意,.fadeIn()它不会返回 a Deferredor 承诺。因此,这将被视为自动解析,而不是等待动画。

但是,正如 Bergi 在评论中提到的,您可以使用该.promise()方法Promisefx动画队列创建一个。

$('#output').fadeIn('slow').promise()
于 2013-09-20T22:10:47.240 回答