变换链如何在Q和TypeScript中承诺变成平坦的承诺

时间:2016-12-26 16:00:30

标签: javascript node.js typescript q

我想知道是否有办法在一个单一的承诺中改变连锁店的承诺。我有这段代码:

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只等待方法A和方法D;而不是在等待methodB和methodC。

我想我需要将方法B和C放在promises的向量中,或者甚至制作另一个向量并在第一个Q.all中等待它...但它不是一个清晰的代码,而我想知道是否有更好的方法。

非常感谢!

2 个答案:

答案 0 :(得分:2)

您在<script> window.connect = function () { window.alert("Oi"); }; </script> cmake -G "Visual Studio 14 2015"处理器中错过了return,并且可能在then处理程序中错过methodA,因为您正在使用< em>详细箭头功能:

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

总体而言,在methodCmethodB解决之前,您阵列中的第一个承诺不会得到解决; methodC立即被召唤,因此可以更快解决。

阵列构​​造也可以更简单:

methodD

答案 1 :(得分:1)

你有一个小错误,几乎是一个错字:

promises.push(this.methodA().then(wasOk => {
      this.methodB().then(wasOk => {
        this.methodC();
      });
    }));

它是大括号 - 它们将一个承诺的回报改为未定义的回报。你可以这样做:

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()];
相关问题