给出这样的功能。 。
function self_time() {
console.log('hi');
setTimeout(self_time, 1000);
}
这可能会导致堆栈溢出吗?我知道这不是一个递归调用,并且javascript是异步的,但是这样的东西可以无限期地运行而不会耗尽资源吗?
还有像这样的尝试捕获情况。 。
function try_it() {
try {
console.log('im trying something...');
} catch(e) {
//i failed so im going to try again in 1 second
setTimeout(try_it, 1000);
}
}
假设该功能无限期失败,资源是否耗尽?
我知道setInterval是一种替代方案,但成功时这样的调用将不再需要间歇性地检查。
答案 0 :(得分:2)
这两种功能都不会耗尽资源;实际上没有发生递归,因为浏览器异步调用传递给setTimeout
的函数。但是,您可以通过滚动自己的attemptEvery
实用程序使您的逻辑更清晰一些,如下所示:
function attemptEvery (ms, fn) {
var token = setInterval(function () {
try {
fn.apply(this, [].slice.call(arguments, 2))
clearInterval(token)
} catch (e) {}
}, ms)
}
attemptEvery(100, function () {
dangerousOperation()
console.log('Success!')
})
function dangerousOperation () {
console.log('Attempting dangerous operation!')
if (Math.random() < .6) throw Error()
}
&#13;