如何在不知道将首先执行then()的情况下返回已解析的promise

时间:2018-06-15 09:44:11

标签: javascript node.js

我有一个会返回承诺的方法。如下所示,有两个then()语句。它们中的每一个都包含对radioButton的引用,以及将根据所选的radioButton执行的特定方法。

我事先并不知道选择哪个radioButton。我想要实现的是,该方法应该根据所选的radioButton返回一个已解决的promise。例如,如果我选择radioButton1,则不应执行第一个then(),并且该方法应返回radioButton1的已解决承诺。

如果我选择radioButton2,则不应执行第二个then(),并且该方法应返回radioButton2的已解决承诺。

我希望我清楚地解释了我的观点。请让我知道如何实现它。

CODE1

initComponents() {
return Promise.resolve()
  .then(() => this.getRadioButton1().on(RState.EVENT_ACTION, (action) => {
    this.onRadioButton1Changed.bind(this);
  }))
  .then(() => this.getRadioButton2().on(RState.EVENT_ACTION, (action) => {
    this.onRadioButton2Changed.bind(this);
  }));
}

1 个答案:

答案 0 :(得分:1)

通常在这种情况下你会使用Promise.race,它会在你给它的数组中订阅promises并根据它们中的第一个来解决(解决或拒绝):

initComponents() {
  return Promise.race([
    new Promise(resolve => {
        this.getRadioButton1().on(RState.EVENT_ACTION, (action) => {
          this.onRadioButton1Changed.bind(this); // ???
          resolve(this); // or `resolve(action);` or `resolve({button: this, action});`
        })
    }),
    new Promise(resolve => {
        this.getRadioButton2().on(RState.EVENT_ACTION, (action) => {
          this.onRadioButton2Changed.bind(this); // ???
          resolve(this); // or `resolve(action);` or `resolve({button: this, action});`
        })
    })
  ]);
}

...但这似乎不是承诺的用例;事件发生不止一次,但承诺只能解决一次。另外,this.onRadioButton1Changed.bind(this);是一个无操作,你没有在任何地方保存绑定函数。

或避免重复:

const promiseForButtonActionWithBind = (button, fn) => new Promise(resolve => {
  button.on(RState.EVENT_ACTION, (action) => {
    fn.bind(this); // ???
    resolve(this); // or `resolve(action);` or `resolve({button, action});`
  })
});

然后

initComponents() {
  return Promise.race([
    promiseForButtonActionWithBind(this.getRadioButton1(), this.onRadioButton1Changed),
    promiseForButtonActionWithBind(this.getRadioButton2(), this.onRadioButton2Changed)
  ]);
}