递归$.ajax函数,并允许浏览器刷新/呈现更新的div



我对js承诺有一个问题,希望有人能帮我解决。下面的函数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更新刷新,但似乎失去了承诺,因此脚本继续,我无法在myFunction递归时填充它构建的数组。

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

提前感谢您的帮助!

好的-现在有以下内容:

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

refreshscreen所在位置:

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);

最新更新