Для некоторых методов Typescript, которые я создаю, мне часто нужна асинхронность обещания, но я не требую, чтобы обещание возвращало значение (концептуально). Простым примером может быть вызов метода initLanguageStrings () для загрузки языковых строк, используемых приложением. Строки языка помещаются в глобальную структуру, но обещание по-прежнему необходимо, чтобы гарантировать, что приложение не будет продолжать работу до тех пор, пока строки языка не будут загружены.
Перемножьте этот сценарий два или три раза, а затем я свяжу всю работу по инициализации в набор обещаний, которые все вместе должны быть выполнены, прежде чем продолжить. Поэтому я использую Promise.all, например (пример):
initialiseApp( ): Promise< void >
{
let promises: Promise< any >[ ] = [ ];
promises.push( this.initLanguageStrings( ) );
promises.push( this.initModelData( ) );
promises.push( this.initUserInfo( ) );
return Promise.all( promises );
}
Приведенный выше код на самом деле не компилируется (TS1.5 / 1.6), потому что Promise.all () возвращает Promise ‹any []> not Promise‹ void>.
В итоге я пишу следующее:
return new Promise( ( resolve, reject ) => {
Promise.all( promises )
.then( ( dummy: any[ ] ) => {
resolve( );
} );
} );
Я считаю, что это семантически правильный подход, потому что «реализация» на самом деле остается скрытой, а «внутреннее обещание» (из Promise.all) никогда не «ускользает» от вызывающей стороны initialiseApp ().
Но, с другой стороны, я считаю этот подход уродливым и хотел бы найти более удобный способ сделать это, поскольку возвращение Promise ‹void> становится для меня довольно распространенным шаблоном.
Есть ли лучший способ достичь того, что я пытаюсь сделать?
Компилятор разрешит:
return Promise.all( promises ).then( ( ) => { } );
Но мне это тоже кажется "хитрым" и уродливым.