[英]How transform chain's promises into flat promise in Q and TypeScript
我想知道是否有一種方法可以將連鎖經營的承諾轉化為統一的承諾。 我有以下代碼:
import * as Q from 'q';
export class MyClass {
private methodA(): Q.Promise<boolean> {
let deferred = Q.defer<boolean>();
//some stuff, like database calls, etc
return deferred.promise;
}
private methodB(): Q.Promise<boolean> {
let deferred = Q.defer<boolean>();
//some stuff, like database calls, etc
return deferred.promise;
}
private methodC(): Q.Promise<boolean> {
let deferred = Q.defer<boolean>();
//some stuff, like database calls, etc
return deferred.promise;
}
private methodD(): Q.Promise<boolean> {
let deferred = Q.defer<boolean>();
//some stuff, like database calls, etc
return deferred.promise;
}
run(): Q.Promise<boolean> {
let deferred = Q.defer<boolean>();
let promises = [];
promises.push(this.methodA().then(wasOk => {
this.methodB().then(wasOk => {
this.methodC();
});
}));
promises.push(this.methodD());
//Wait all promises
Q.all(promises).then(wasOk => deferred.resolve(wasOk));
return deferred.promise;
}
}
這段代碼有一個問題:Q.all只在等待methodA和methodD; 並且不等待methodB和methodC。
我想我需要將方法B和C放在promises的向量中,或者甚至制作另一個向量,並在第一個Q.all中等待它……但這不是一個清晰的代碼,我想知道是否有更好的方法。
非常感謝!
您只是錯過了methodA
上的then
處理程序中的return
,並且可能在其then
處理程序中缺少了return
,因為您正在使用詳細的箭頭函數:
promises.push(this.methodA().then(wasOk => {
return this.methodB().then(wasOk => {
//^^^^^^^
return this.methodC();
// ^^^^^^^
});
}));
或具有簡潔的箭頭功能:
promises.push(this.methodA().then(wasOk => this.methodB().then(wasOk => this.methodC())));
或帶有帶換行符的簡潔箭頭:
promises.push(this.methodA().then(wasOk =>
this.methodB().then(wasOk =>
this.methodC()
)
));
請注意,該代碼執行此操作:
methodA
並等待其解析,然后 methodB
並等待其解決,然后 methodC
因此,總的來說,數組中的第一個承諾要等到方法methodB
和方法methodC
解析后methodC
解決。 methodD
被調用,因此可以更快地解決。
數組構造也可能更簡單:
promises = [
this.methodA().then(wasOk =>
this.methodB().then(wasOk =>
this.methodC()
)
),
this.methodD()
];
您有一個小錯誤,幾乎是一個錯字:
promises.push(this.methodA().then(wasOk => {
this.methodB().then(wasOk => {
this.methodC();
});
}));
這是花括號-它們將promise的返回更改為undefined的返回。 您可以這樣做:
promises.push(this.methodA().then(wasOk =>
this.methodB().then(wasOk =>
this.methodC();
);
));
或這個:
promises.push(this.methodA().then(wasOk => {
return this.methodB().then(wasOk => {
return this.methodC();
});
}));
甚至這個:
promises = [this.methodA(), this.methodB(), this.methodC()];
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.