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