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