javascript - jquery .done() 中的异步回调函数未执行

标签 javascript jquery asynchronous async-await

为什么将异步函数作为 jQuery 的回调函数 deferred.done()不行?即为什么

jqueryObj.fadeTo("slow", 1)
    .promise().done(asyncFunc);

不行,但是

jqueryObj.fadeTo("slow", 1)
    .promise().done(function() {
        asyncFunc();
    );

是吗?

(另外,请注意 jqueryObj.click(asyncFunc) 确实有效。)


例子:

<h2>Title</h2>
<ul>
  <li>Item</li>
  <li>Item</li>
  ...
</ul>

标题完成淡入后,列表中的每个项目按顺序淡入。淡入淡出时间为 20000 毫秒,但列表项之间的延迟为 250 毫秒(因此下一个列表项开始淡入,而前一个列表项仍在进行中)。

JS:

var title = $("h2"),
    listItems = $("ul li");

function wait(delay) {
    return new Promise(function(resolve) {
        setTimeout(resolve, delay);
  });
}

async function reveal() {
    for (var i = 0; i < listItems.length; i++) {
        $(listItems[i]).fadeTo(2000, 1);
        await wait(250);
    }
}

title.fadeTo(500, 1)
    //.promise().done(reveal) doesn't work!
    .promise().done(function() {
        reveal();
    });

Here is a JSFiddle显示出预期的效果。您可以尝试换成注释掉的行,看没有任何反应。注释掉的行是您通常期望函数的工作方式

最佳答案

问题是在 jQuery 3 之前,$.Deferred (jQuery promise api) 不是 Promises A+合规。

为了传递对 async 函数的引用,请使用 then()(更标准的 promise 方法)而不是 done() 和使用 jQuery v3+

title.fadeTo(1000, 1).promise().then(reveal)

Working fiddle

关于javascript - jquery .done() 中的异步回调函数未执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48227185/

相关文章:

javascript - 对于异步内部函数,外部函数的函数参数是否会发生变化?

javascript - Parsley.JS - 使用回调获取错误列表

php - 文件仅在包含时生成换行符

c# - 自动完成从存储在标签中的 JSON 数组中读取的源代码不起作用

javascript - Angular 2 可观察到的问题

javascript - Angular 4 没有在我的子组件中渲染我的 ID

javascript - D3.js 条形图动画未正确退出

javascript - 为什么可折叠列表不起作用?

Phpmailer 和异步发送电子邮件

javascript - 使用 Promise 进行表遍历/递归