我想知道是否有一种方法可以将连锁经营的承诺转化为统一的承诺。我有以下代码:

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中等待它……但这不是一个清晰的代码,我想知道是否有更好的方法。

非常感谢!

最佳答案

您只是在return上的then处理程序中,可能是在methodA处理程序中缺少了then,因为您使用的是详细的箭头函数:

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


因此,总的来说,数组中的第一个承诺要等到methodBmethodC解析后才能解决; methodD立即被调用,因此可以尽快解决。

数组构造也可能更简单:

promises = [
  this.methodA().then(wasOk =>
    this.methodB().then(wasOk =>
      this.methodC()
    )
  ),
  this.methodD()
];

10-06 00:27