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。我以前没见过那个。谢谢