【问题标题】:How to react on function that setting timeout如何对设置超时的功能做出反应
【发布时间】:2021-05-29 15:35:00
【问题描述】:

我有功能:

function a(){ setTimeout(()=>{console.log('a')}, 0) }

这个函数在调用栈的最后发送console.log不是吗?

如何编写一个在这个 console.log 之后运行的函数

我发现的唯一方法是以相同的方式在调用堆栈上发送函数

a();
setTimeout(()=>{ console.log('after a'), 0 });

但这对我来说看起来很糟糕。我尝试过承诺,但我可以对'a'函数做出反应,而不是在里面的console.log上。

函数“a”不可编辑

【问题讨论】:

  • 接受回调并在您想要的时间调用它:function a(callback){ setTimeout(()=>{console.log('a'); callback?.()}, 0) },然后是a(() => console.log('after a'));
  • 也可以使用 Promise:function a(){ return new Promise( resolve => setTimeout(()=>{console.log('a'); resolve()}, 0) ) },然后像 a().then(() => console.log('after a')) 一样使用它。
  • 函数'a'不可编辑

标签: javascript async.js


【解决方案1】:

您可以使用 "callback" ,即对 a( ) 函数的另一个函数的引用。示例:

function yourFunctionToBeRunnedAfter(){
..
..
}

function a(callback){ 
   setTimeout(()=>{
         console.log('a');
         calback();  // ==> here is your function execution.
    }, 0);
}

a(yourFunctionToBeRunnedAfter);

如果您有参数要传递给 callback() 调用,您可以使用 apply()call()bind()@987654324 @ 例子:

function a(callback,...params){  // ... is the spread operator
   setTimeout(()=>{
         console.log('a');
         callback([...params]);  // ==> here is your function execution by spreading your params to the callback call.
    }, 0);
}
a(yourFunctionToBeRunnedAfter, 1,2,3);

【讨论】:

  • 在 javascript 中,您可以使用原型设计甚至不使用(在您的情况下)覆盖任何对象(函数是对象),例如:a = function(callback){ .. .. }
  • 事实并非如此。它更像是拼图。在现实世界中,我知道回调、承诺、生成器等。问题是如果您无法编辑或覆盖函数 a 该怎么办。
  • 如果我在你的位置,并且函数不可编辑,我将使用一些技巧将函数引用的内容/逻辑复制到另一个投影引用,并正确操作它。如果您不使用回调、承诺、可观察对象甚至“Proxy”对象,我认为没有其他解决方案可能对您有帮助。但老实说,我们仍然需要更多关于您需要什么的详细信息..
  • 我明白了。这是工作面试的一部分。我不能那样“作弊”。但是我找不到其他解决方案,只能再次超时以将其他函数放在调用堆栈的末尾。但这似乎很容易和不雅。我想知道有没有更好的解决方案
【解决方案2】:

你需要使用一个承诺。我建议使用 async-await,但这真的取决于您的偏好。

function a () {
  return new Promise(resolve => {
    setTimeout(() => {
      console.log('a')
      resolve()
    }, 0)
  })
}

a().then(() => console.log('after a'))

如果您需要知道超时何时结束,我建议您创建一个辅助函数:

const wait = (time) => new Promise(r => setTimeout(r, time))

那么你可以这样使用它:

(async () => {
  console.log('Hello')
  await wait(1000) // wait 1 second
  console.log('Hello a second later')
})()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-31
    相关资源
    最近更新 更多