我已成功锁定了承诺,但我发现我的方式足够复杂:我想知道是否有更优雅的方法来做。
我使用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
。
对于每个承诺,我添加了名为getIntervention
和scriptLoaded
的回调,呼叫connectionDetected
。
这是我的代码:
resolve()
有没有办法简化3个承诺链接的实现?
答案 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(
() => { ... }
);
}