Как выполнить "thread.sleep" в приложении angular 7 в неасинхронном методе (ngOnInit)? - PullRequest
0 голосов
/ 18 марта 2019

В SO много вопросов и решений, но ни один из них не работает при вызове из компонента init, который не является асинхронным. Вот пример:

  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)

Как спать в ngOnInit? Причина, по которой я спрашиваю, состоит в том, что я пытаюсь создать прототип приложения с несколькими окнами, которое взаимодействует с localStorage. 1-е запущенное окно становится главным окном. Когда я запускаю 2 окна почти одновременно, последнее еще не находит материал 1-го окна в localStorage и думает, что это также mainWindow. Поэтому логичным решением было бы подождать 1-2 секунды и попытаться снова прочитать localStorage, если в окне ничего не найдено. После «сна» второе окно обнаружило бы, что окно на самом деле уже было, и оно становится дочерним окном.

1 Ответ

0 голосов
/ 18 марта 2019

Вызов в ngOnInit не ожидает результата от асинхронной операции. Вам нужно либо запустить код после вызова внутри функции обратного вызова, переданной then или , также сделать ngOnInit асинхронным.

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

или

async ngOnInit() {  
    console.log('ngOnInit');
    await this.sleepExample();
    console.log('After sleep');
}

В качестве примечания вы используете неверную терминологию. Вы не можете "спать" потоком в javascript, и вы не должны этого хотеть. Я бы порекомендовал прочитать ответ на предыдущий вопрос, поскольку он тесно (если не напрямую) связан с вашим вопросом: Как вернуть ответ от асинхронного вызова?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...