Javascript 如何";线程。睡眠“;在angular 7应用程序中使用非异步方法(Ngonit)?
在SO中有许多问题和解决方案,但当从非异步的ComponentInit调用时,这些问题和解决方案都不起作用。下面是一个例子: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())
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');
}