Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript jQuery承诺不会使用未定义的html方法_Javascript_Jquery_Promise_Jquery Deferred - Fatal编程技术网

Javascript jQuery承诺不会使用未定义的html方法

Javascript jQuery承诺不会使用未定义的html方法,javascript,jquery,promise,jquery-deferred,Javascript,Jquery,Promise,Jquery Deferred,我有以下标记和脚本: <div id="output" hidden> <img src="ajax-loader.gif" /> </div> <script src="Scripts/jquery.min.js"></script> <script> var promises = [ $.getJSON("./MyContacts.js"), $("#output").fa

我有以下标记和脚本:

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

var承诺=[
$.getJSON(“./MyContacts.js”),
$(“#输出”).fadeIn(“慢”),
新的递延美元(功能(dfd){
设置超时(dfd.resolve,5000);
回报dfd承诺;
})
];
美元。当(承诺)。然后(
功能(xhr、褪色、定时器){
.html(xhr[0].length+“找到联系人”);
},
功能(xhr,状态){
$('#output').html(“检索联系人时出错”)
}
);
运行代码时,我收到一条错误消息:

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

导致此错误的原因是什么?

不希望出现延迟的数组,而是希望每个延迟都有自己的参数

由于
数组
本身不是一个
延迟的
,因此它被视为一个真实的自动解析。而且,
褪色
未定义的
而不是您选择的
$(“#输出”)
,因为
xhr
实际上保存了所有内容

console.log(xhr);
// Array( [jqXHR], [jQuery], [Promise] )
您需要使用
.apply()
承诺传递给它:

$.when.apply($, promises).then(/* ... */);
或者,为了将来参考(ES6),使用排列:

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

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

但是,正如Bergi在评论中提到的,您可以使用为
fx
动画队列创建
Promise

$('#output').fadeIn('slow').promise()

$ouput@jamesemanon-是的,这就是我的意思,在那里打字太快了。:-)尝试此var html=“检索联系人时出错。”;append(html)+1-啊,现在完全有道理了。感谢您的解释。您可以使用返回动画队列承诺的,而不是手动构造延迟队列。@Bergi Nice。我以前没见过那个。谢谢