对于我构建的一些Typescript方法,我经常需要一个promise的异步性,但我不需要承诺返回一个值(从概念上讲)。一个简单的示例可能是调用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&lt;任何[]&gt;不承诺&lt;无效&gt;。
所以我最终写的是:
return new Promise( ( resolve, reject ) => {
Promise.all( promises )
.then( ( dummy: any[ ] ) => {
resolve( );
} );
} );
我认为这在语义上是正确的方法,因为“实现”实际上仍然是隐藏的,而“内部承诺”(来自Promise.all)永远不会“逃脱”到initialiseApp()的调用者。
但另一方面,我发现这种方法很丑陋,并希望找到一种更好的方法来做到这一点,因为返回Promise&lt;无效&gt;对我来说正在变得非常普遍。
有没有更好的方法来实现我想要做的事情?
编译器将允许:
return Promise.all( promises ).then( ( ) => { } );
但它让我感到“狡猾”和丑陋。
答案 0 :(得分:8)
因为返回Promise&lt;无效&gt;对我来说正在成为一种非常普遍的模式
您可以使用类型断言
initialiseApp( ): Promise< void >
{
let promises: Promise< any >[ ] = [ ];
promises.push( this.initLanguageStrings( ) );
promises.push( this.initModelData( ) );
promises.push( this.initUserInfo( ) );
return Promise.all( promises ) as Promise<void>;
}
注意:当您使用断言时,在这种情况下,您基本上是撒谎到编译器。注意编译器认为一件事并且运行时看到另一件事的错误。
return Promise.all( promises ).then( ( ) => { } );
这是正确的方式。 运行时匹配编译器推断的内容。如果你想要一个Promise<void>
...那么制作一个Promise<void>
就是这个代码示例所做的。