簡體   English   中英

如何在Q和TypeScript中將鏈式承諾轉化為統一承諾

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM