【问题标题】:How to chain 3 Promises with angular2 and typescript如何用 angular2 和 typescript 链接 3 个 Promises
【发布时间】:2017-05-09 03:11:48
【问题描述】:

我已经成功地链接了 Promise,但我发现我这样做的方式非常复杂:我想知道是否没有更优雅的方式来做到这一点。

我使用 Angular2、Typescript 和 signalR。

我有一个服务getIntervention,它通过 Id 从服务器返回一个对象。

在调用getIntervention之前,我想检查客户端是否连接到服务器,在连接到服务器之前,我想加载SignalR脚本。

所以我创建了第一个 promise scriptLoadedPromise,它等待 SignalR 脚本被加载。当scriptLoadedPromise 被解析时,一个新的promise connectionPromise 被创建,等待连接建立。

connectionPromise被解析后,调用服务getIntervention

对于每个承诺,我添加了名为 scriptLoadedconnectionDetected 的回调,它们调用了 resolve()

这是我的代码:

public loadIntervention( numFI : number ) : Promise<Intervention>
{

    let scriptLoadedPromise : Promise<Intervention> = new Promise( ( resolve, reject ) =>
    { 
        // si le script est chargé alors la promesse est déjà tenue
        if ( this.isScriptLoaded )
            resolve();
        else
            this.scriptLoaded = ( () => { resolve(); } ) ;
    }).then
    ( () => {
        let connectionPromise : Promise<Intervention> = new Promise( (resolve, reject) =>
        {
            // si le serveur est connecté alors la promesse de connection est déjà tenue
            if ( this.Connected )
                resolve();
            else
                this.connectionDetected = ( () => { console.log("RECONNETED !!!!!"); resolve(); } );

        } )
        .then( ()  => { return this.proxy.server.getIntervention( numFI ); } );

        return connectionPromise;
    });


    return scriptLoadedPromise;
}

有没有办法简化 3 个承诺链接的实现?

【问题讨论】:

    标签: javascript angular typescript promise signalr


    【解决方案1】:

    如果这些 Promise 相互依赖,则类似于您已经创建的。您可以通过将逻辑放入单独的方法中来增强其代码风格,例如

    private firstAction():Promise<any> {
      return new Promise<any>(
        (resolve, reject) => { ... }
      );
    }
    private secondAction():Promise<any> {
      return new Promise<any>(
        (resolve, reject) => { ... }
      );
    }
    execute() {
      this.firstAction().then(
        (firstResult:any) => this.secondAction().then(
          (secondResult:any) => { ... }
        );
      )
    }
    

    如果允许promise并行执行,你可以使用Promise.all(),例如

    execute() {
      let promises:Promise<any>[] = [];
      promises.push(this.firstAction());
      promises.push(this.secondAction());
    
      Promise.all(promises).then(
        () => { ... }
      );
    }
    

    【讨论】:

    • 谢谢,还有一个问题:我真的需要使用回调来解决这些承诺吗?
    • 我只是想我可以将创建的 Promise 添加为私有成员,并在建立连接时明确解决它们。
    • (reject, resolve) => { ... } 需要是 (resolve, reject) => { ... }
    • Thx @Seb, (resolve, reject) 当然是 Promise&lt;T&gt; 参数的正确顺序
    猜你喜欢
    • 2017-04-25
    • 1970-01-01
    • 2018-11-07
    • 2016-08-08
    • 2016-02-19
    • 1970-01-01
    • 2014-12-13
    • 2015-04-27
    相关资源
    最近更新 更多