【问题标题】:What is the purpose of the JQuery object promise?JQuery 对象承诺的目的是什么?
【发布时间】:2017-12-18 13:11:42
【问题描述】:

几年来,我一直在处理一个兼职问题,其中一些用 jquery html 函数加载的 DOM 元素在函数调用后无法立即访问(这种行为有点像执行一个函数而不等待文档就绪事件)。尽管.html() 应该是同步的,但这个SO answer(还有这个one)建议使用html 函数的承诺:

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

promise 在这种情况下可能是有意义的,但这个promise 让我感兴趣的是它也将与每个jquery 的对象一起返回:

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

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

【问题讨论】:

  • 当给定集合上的所有当前动画都完成时,返回的承诺将解析。
  • 链接的答案是完全错误的。
  • 不,只是你链接到的那个,有 30 多个赞成票。
  • 这个one也是错的
  • 是的,那个也是。

标签: javascript jquery html


【解决方案1】:

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

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

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

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

【讨论】:

  • 那么如何等待浏览器渲染完成呢?我想为刚刚从.html 方法添加的元素添加一个事件侦听器。我没有得到我的案例的异步逻辑缺陷部分
  • 文件准备好,窗口加载,否则如果你有异步废话发生,你必须单独等待每一个。如果需要等待渲染器运行,请使用请求动画帧或 settimeout。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-13
  • 2012-02-04
  • 2023-04-07
  • 2019-04-27
  • 1970-01-01
  • 2011-06-30
相关资源
最近更新 更多