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

时间:2016-03-23 17:59:27

标签: javascript jquery ajax recursion settimeout

我有一个js承诺的问题,我希望有人可以帮助我。下面的函数myFunction执行$ .ajax调用,因此返回一个promise。因为我需要将控制权交还给浏览器以显示此函数在我递归时更新的刷新div,所以我按如下方式调用setTimeout:

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

其中myFunction(recurses)现在返回一个承诺,当它完成它的$ .ajax调用时。

如果我只是打电话:

return myFunction(email);

没有上面的setTimeout函数构造,承诺将被传递并且我的所有承诺都被捕获并允许我获得我需要的数组输出,并且当递归结束时一切都很好。但是如果没有setTimeout,我就不会刷新浏览器。使用它如上所述我得到div更新刷新显示,但似乎失去了承诺,所以脚本继续,我不能填充myFunction在recurses时构建的数组。

有关如何确保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,因为我们递归!

1 个答案:

答案 0 :(得分:1)

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

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

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