gpt4 book ai didi

javascript - 等待带有 setTimeout 的函数完成而不篡改该函数

转载 作者:行者123 更新时间:2023-11-29 19:19:06 26 4
gpt4 key购买 nike

所以基本上我有一个函数,其中有一个 setTimeout,如下所示:

function foo(){
console.log('starting');
setTimeout(function(){
console.log('done');
}, 2000); // some arbitrary delay
}

我想调用这个函数,让它真正完成,然后在它结束时调用第二个函数:

foo();
secondFunction();

有没有一种方法可以让我在 secondFunction() 触发之前等待 foo() 完成运行,包括它的 setTimeout 调用?我怀疑有一种方法可以用 Promises 做到这一点,因为我之前已经看到这个问题用 Promises 解决了,但是我看到的所有解决方案都包括篡改具有 setTimeout 的初始函数;在我的情况下,我根本无法更改 foo()

有没有办法在不改变 foo() 的情况下解决这个问题?这意味着我无法在 foo() 中创建 Promise,也无法向 foo() 显式添加回调函数。

最佳答案

您可以猴子修补 setTimeout 因为它是全局对象的一个​​属性:

function trapTimeout() {
return new Promise(function(resolve, reject) {
var setTimeout = window.setTimeout;
window.setTimeout = function(cb, delay) {
var args = [].slice.call(arguments, 2);
setTimeout.call(window, function() {
window.setTimeout = setTimeout;
cb.apply(null, args);
resolve();
}, delay, ctx);
}
});
}

var trap = trapTimeout();
foo();
trap.then(function() { console.log('really done') });

这是一个比较讨厌的 hack。如果在这段代码之后有其他东西创建了一个计时器,它很可能会呕吐(因为 .then 调用不会停止任何后续代码或事件循环的运行,并且猴子修补一直保持到位,直到超时被触发)。

关于javascript - 等待带有 setTimeout 的函数完成而不篡改该函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33877977/

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