JQuery对象承诺的目的是什么?

时间:2017-07-13 16:05:50

标签: javascript jquery html

几年来,我正处理一个兼职问题,其中一些装有jquery html函数的DOM元素在函数调用后不能立即访问(行为有点像执行函数而不等待对于文档就绪事件)。即使.html()被认为是同步的,但SO answer(以及此one)建议使用html函数的承诺:

$('#divId').html("<h1>hello</h1>").promise().done(function(){
    //Callback
});

一个承诺在这样的上下文中是有意义的,但是对于这个承诺引起我兴趣的是它也会随着每个jquery的对象返回:

$('#divId').promise().done(function(){
    //Will also be called...
});

由于我在html函数的文档中找不到任何关于它的内容,我想知道这个承诺的真正目的是什么,以及它是否在这种情况下正确使用。

1 个答案:

答案 0 :(得分:5)

这两种方法无关。人们经常提出这个问题的原因是因为有人发现他们可以使用.promise().done()来制作具有竞争条件的代码。它的工作原理与setTimeout(fn, 0)中包含相同代码的原因相同。它会将其推送到稍后运行的回调队列,可能是在浏览器执行渲染或其他异步回调完成之后。

.html是同步的,没有回调,也不需要回调。但是,浏览器的渲染器是异步的,因此在调用堆栈清除之前它不会呈现更改。使用.promise将回调推送到回调队列,从而在渲染之后运行代码,解决竞争条件或异步逻辑缺陷。

在jquery集合上使用的

.promise()将返回一个承诺,该承诺将在所有当前运行的jquery动画完成后解析。如果当前没有正在运行的动画,则promise将立即解决,并且一旦堆栈清除,回调将被推送到回调队列以进行调用。

这只不过是一个乐队。我建议不要使用它,而是修复任何异步逻辑缺陷导致它成为解决方案。