JavaScript:停止执行直到延迟结束

JavaScript:停止执行直到延迟结束,javascript,settimeout,Javascript,Settimeout,我的代码如下:- function doStuff(){ // Note:- this funcion take 50ms for ececution as i have put // timeout setTimeout(function(){ // some line of code .... }, 50); return; } doStuff(); console.log('This should execute

我的代码如下:-

function doStuff(){
    // Note:- this funcion take 50ms for ececution as i have put 
    // timeout
    setTimeout(function(){ 
        // some line of code
        ....
    }, 50);

    return;
}
doStuff();
console.log('This should execute after doStuff() complete its work.")
// after that more many lines of code and more stuff are here
.....
.....
  • 现在我想要的是,正如您在这里看到的,doStuff()需要50毫秒的时间来执行,所以doStuff()之后的代码应该在doStuff()完成它的工作之后执行。例如,该控制台应在doStuff()完成后打印
  • 请注意,我知道我可以在那里设置超时,但我不能设置超时,因为我在一个开源项目上工作,所以我不能更改在函数调用之后编写的代码,我甚至不能等待承诺,因为我告诉过我不能更改代码,我能做的就是更改我创建的doStuff方法。有没有什么方法可以阻止doStuff()返回,比如doStuff()在延迟结束之前不应该返回,一种方法是我们可以递归调用doStuff,但我想要更好的方法。请帮帮我

    • 您需要使用回调或承诺。下面是一个承诺的例子:

      函数doStuff(){
      var承诺=新承诺((解决)=>{
      //注意:-如我所说,此函数需要50毫秒执行
      //超时
      setTimeout(函数(){
      //某行代码
      解决();
      }, 1000);
      });
      回报承诺;
      }
      异步函数main(){
      console.log('Start');
      等待多斯塔夫();
      log('这应该在doStuff()完成其工作后执行');
      }
      
      main()您需要使用回调或承诺。下面是一个承诺的例子:

      函数doStuff(){
      var承诺=新承诺((解决)=>{
      //注意:-如我所说,此函数需要50毫秒执行
      //超时
      setTimeout(函数(){
      //某行代码
      解决();
      }, 1000);
      });
      回报承诺;
      }
      异步函数main(){
      console.log('Start');
      等待多斯塔夫();
      log('这应该在doStuff()完成其工作后执行');
      }
      
      main()
      等待
      一个
      承诺
      在超时结束时解决(或调用
      。然后
      打开
      DOSTAUF
      一次
      DOSTAUF
      返回
      承诺
      )是的,我知道,但我不能等待,我不能触摸DOSTAUF()之后编写的代码,因为我必须将所有内容移到DOSTAUFF()。然后(函数(){//HERE})我不能这么做如果你不能改变调用
      doStuff
      的块,那么你所要求的是不可能的。不要害怕使用
      。那么
      我知道,但我们可以通过递归来欺骗它,这也不是不可能的:
      等待
      一个
      承诺
      在超时结束时解决(或者调用
      doStuff
      上的
      一次
      doStuff
      返回
      承诺
      )是的,我知道,但我等不及了,我也不能碰在doStuff()之后写的代码,因为我必须将所有内容移动到doStuff()。然后(函数(){//HERE})如果你不能更改调用
      doStuff
      的块,那么你所要求的是不可能的。不要害怕使用
      。那么
      我知道,但我们可以通过递归来欺骗它,这也不是不可能的:)