Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/410.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何";线程。睡眠“;在angular 7应用程序中使用非异步方法(Ngonit)?_Javascript_Angular - Fatal编程技术网

Javascript 如何";线程。睡眠“;在angular 7应用程序中使用非异步方法(Ngonit)?

Javascript 如何";线程。睡眠“;在angular 7应用程序中使用非异步方法(Ngonit)?,javascript,angular,Javascript,Angular,在SO中有许多问题和解决方案,但当从非异步的ComponentInit调用时,这些问题和解决方案都不起作用。下面是一个例子: private delay(ms: number) { return new Promise(resolve => setTimeout(resolve, ms)); } private async sleepExample() { console.log("Beforep: " + new Date().toString())

在SO中有许多问题和解决方案,但当从非异步的ComponentInit调用时,这些问题和解决方案都不起作用。下面是一个例子:

  private delay(ms: number)
  {
    return new Promise(resolve => setTimeout(resolve, ms));
  }

  private async sleepExample()
  {
    console.log("Beforep: " + new Date().toString());
    // Sleep thread for 3 seconds
    await this.delay(3000);
    console.log("Afterp:  " + new Date().toString());
  }


  ngOnInit(): void {  
    console.log('ngOnInit');
    this.sleepExample();
    console.log('After sleep');
    // do lots of stuff
    console.log('After lots of stuff);
  }
控制台输出如下所示:

ngOnInit
Beforep: Mon Mar 18 2019 21:22:58 GMT+0200 (Eastern European Standard Time)
After sleep
…
After lots of stuff
Afterp:  Mon Mar 18 2019 21:23:02 GMT+0200 (Eastern European Standard Time)

在恩戈尼特如何睡觉?我提出这个问题的原因是,我正在尝试原型化一个与localStorage通信的多窗口应用程序。启动的第一个窗口成为主窗口。当我几乎同时启动两个窗口时,后者还无法在localStorage中找到第一个窗口的内容,并认为它也是主窗口。因此,逻辑解决方案是等待1-2秒,如果窗口没有找到任何内容,则再次尝试读取本地存储。在“睡眠”之后,第二个窗口将发现实际上已经有一个窗口,它将成为childwindow。

ngOnInit中的调用不会等待异步操作的结果。您需要在传递给
的回调函数中的调用之后运行代码,然后
或者使
ngOnInit
异步

ngOnInit(): void {  
    console.log('ngOnInit');
    this.sleepExample().then(() => console.log('After sleep'));
}



作为补充说明,您使用了错误的术语。你不能在javascript中“休眠”线程,你也不应该这样做。我建议您通读上一个问题的答案,因为它与您的问题密切相关(如果不是直接相关的话):

您不应该以同步方式睡觉。你想做什么?为什么要这么做?指定一个用例可能有助于得到一个对您有帮助的答案。与Matt Tester达成一致,为了得到一个好的答案,您需要使您的预期用例更加清晰。有一些方法可以让组件等待视图完全加载,如果这是您想要的(例如,请参阅ngAfterViewChecked)@Bergi和其他方法:我想等待一点本地存储中的东西。我编辑了我的问题。不知道这些窗口是如何创建的,它们是否是组件,但如果它们是角度组件,也许最好让它们使用事件相互通信(另请参见输出和事件发射器),谢谢您的快速回答!这就是为什么使用引号,因为它不存在。这绝对令人兴奋。@charm-Javascript只有一个执行线程。如果您能够睡眠,那么就不能运行javascript代码。它不可用,因为它不需要或不需要。后者不起作用。它做了一些重定向。所以“睡眠”只有在忙循环中才有可能?好吧,我读了更多关于它的内容。看来停止整个程序的唯一方法就是忙着等待。
async ngOnInit() {  
    console.log('ngOnInit');
    await this.sleepExample();
    console.log('After sleep');
}