gpt4 book ai didi

javascript - setTimeout 之后,这会丢失上下文

转载 作者:行者123 更新时间:2023-11-28 08:28:54 38 4
gpt4 key购买 nike

我有一个名为 succeeder 的自制函数,它应该尝试运行一个名为 func 的函数,如果它无法尝试在一段时间后再次运行它。

第一次效果很好,当在 setTimeout 之后第二次调用 func 时,它失败了,这似乎脱离了上下文。

你能想到这段代码中有什么不正确的地方吗?

succeeder({
func : function () {
!this.dbOpen && this.init();
return true;
},
context : this,
interval : 2000,
success : function () { return true;}
});

function succeeder(opts) {
function run() {
try {
//_.delay(function(){opts.func();}.bind(opts.context), 2000);
setTimeout(function(){ return _.bind(opts.func, opts.context)(); }, 2000);
} catch (e) {
run(this.opts, this.interval);
}
}
run();
};

最佳答案

您的代码没有执行与描述类似的操作。而且描述不清楚:“如果 [func] 失败”是什么意思? func 是否抛出异常?返回?或者什么?

没有代码来检查 func 的返回值,但 func 的示例版本返回 truetrue 返回值的用途是什么?

您有一个 try/catch block ,这让我怀疑您正在谈论抛出异常的 func 调用。但是这个 try/catch 不会捕获 func 抛出的任何异常!

这是因为 try/catch 正在包装 setTimeout 调用。但是 func 不是从 try/catch block 内部调用的。当超时触发时,它被称为稍后,并且此时 try/catch 不再有效。

opts.success 函数是什么?它从未被使用过。

此外,在第一次尝试调用 func 之前,代码始终会延迟两秒。您想要这样,还是希望第一个调用立即进行,并且仅在调用失败并重试时才延迟?

这是一个工作示例,它的功能与您所说的类似。我假设“失败”意味着“引发异常”,并且您不希望初始 func 调用出现任何延迟。

为了测试代码,我使用了一个 func 函数,该函数运行倒计时并每次抛出异常,并最终在倒计时达到 0 时成功。

在打开调试控制台的情况下运行此命令,以便您可以看到 console.log() 消息:

function Test() {
this.countdown = 5;

succeeder({
func: function () {
console.log(
this.constructor.name,
'countdown:',
this.countdown
);
if( this.countdown-- ) {
console.log( 'func throwing error' );
throw new Error( 'fail' );
}
console.log( 'func success!' );
},
context: this,
interval: 1000,
success: function () { return true; }
});
};

new Test;

function succeeder(opts) {
var func = _.bind( opts.func, opts.context );
function run() {
try {
func();
} catch (e) {
setTimeout( run, opts.interval );
}
}
run();
};

关于javascript - setTimeout 之后,这会丢失上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22081944/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com