如何使用angular2和typescript链接3个Promises

时间:2016-12-23 11:54:01

标签: javascript angular typescript promise signalr

我已成功锁定了承诺,但我发现我的方式足够复杂:我想知道是否有更优雅的方法来做。

我使用Angular2,Typescript和signalR。

我有一个服务 jSplitPane1 = new JSplitPane(); jSplitPane2 = new JSplitPane(); jSplitPane1.setOrientation(JSplitPane.HORIZONTAL_SPLIT); jSplitPane1.setRightComponent(jSplitPane2); jSplitPane2.setOrientation(JSplitPane.VERTICAL_SPLIT); jSplitPane1.setTopComponent(jPanel1); jSplitPane1.setBottomComponent(jPanel2); ,它通过Id从服务器返回一个对象。

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

所以我创建了第一个承诺getIntervention,等待加载SignalR脚本。解析scriptLoadedPromise后,会创建一个等待建立连接的新承诺scriptLoadedPromise

解决connectionPromise后,请致电服务connectionPromise

对于每个承诺,我添加了名为getInterventionscriptLoaded的回调,呼叫connectionDetected

这是我的代码:

resolve()

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

1 个答案:

答案 0 :(得分:7)

如果这些承诺相互依赖,那么它与你已经创建的相似。您可以通过将逻辑放入单独的方法(例如,

)来增强代码风格
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.all(),例如。

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

  Promise.all(promises).then(
    () => { ... }
  );
}