javascript - 递归 $.ajax 函数并允许浏览器刷新/渲染更新的 div

标签 javascript jquery ajax recursion settimeout

我对 js promise 有疑问,希望有人能帮助我。下面的函数 myFunction 执行 $.ajax 调用,因此返回一个 Promise。由于我需要将控制权交还给浏览器,以便显示该函数在递归时更新的刷新 div,因此我调用 setTimeout,如下所示:

var nextBitOfWork = function () {
    return myFunction(email);
};
setTimeout(nextBitOfWork, 0);

其中 myFunction (递归)现在在完成 $.ajax 调用后返回一个 promise 。

如果我只是打电话:

return myFunction(email);

如果没有上面的 setTimeout 函数构造, promise 就会被传递,我的所有 promise 都会被捕获,并允许我获得我需要的数组输出,并且当递归结束时一切都很好。但如果没有 setTimeout,我就无法刷新浏览器。按照上面的方式使用它,我得到了 div 更新刷新显示,但似乎失去了 promise ,因此脚本继续,我无法填充 myFunction 在递归时构建的数组。

关于如何确保 setTimeout 可靠地传递 promise ,以便我构建响应数组并显示 div 更新,有什么想法吗?

提前感谢您的帮助!

好的 - 现在有以下内容:

var func = function () {
    myFunction(email);
};
return refreshscreen(func,0);

刷新屏幕在哪里:

function refreshscreen(func,time) {
    var timer = $.Deferred();
    setTimeout(function () {
        return func().then(timer.resolve()); 
    }, time);
    return timer.promise();
}

仍然是同样的问题 - 尽管浏览器呈现 div,但我使用 myFunction 为收集的 $.ajax 响应构建的数组的长度只有 1 个元素 - 尽管它递归了 20 次!如果没有调用刷新屏幕,数组构建得很好,但浏览器在我们递归时永远不会渲染 div!

最佳答案

setTimeout 不会返回您传入的函数返回的值。(它返回一个值,您可以通过将其传递给 clearTimeout 来停止超时)

因此,为了接收 myFunction 返回的值,只需将其包装在调用 setTimeout 的函数中即可。

setTimeout(function () {
  var promise = myFunction(email);
  // do something with promise...
}, 0);

关于javascript - 递归 $.ajax 函数并允许浏览器刷新/渲染更新的 div,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36185447/

相关文章:

php - AJAX 登录表单重新加载页面

jquery - 在禁用的文本区域上添加点击事件(jquery + ui)

jquery - 如何保存在 $.ajax() 调用中所做的 css 更改?

javascript - 预加载图像时 Internet Explorer 循环错误

javascript - 单击折叠元素中的链接时如何跳过触发 Bootstrap 折叠?

javascript - 通过将对象放入数组来重新格式化 JSON

jquery - 如何使用 javascript 更改页面方向?

javascript - 外部 .js 文件中的 JQuery 未运行

javascript - 停止表单操作重定向或 href 重定向

php - 使用 AJAX 发送具有可变字段数的表单,$_POST 数组为空