Javascript 如何在不知道将首先执行哪个then()的情况下返回已解析的承诺

Javascript 如何在不知道将首先执行哪个then()的情况下返回已解析的承诺,javascript,node.js,Javascript,Node.js,我有一个方法可以回报一个承诺。如下图所示,有两条then()语句。它们中的每一个都包含对radioButton的引用,以及将根据所选radioButton执行的特定方法 我事先不知道会选择哪个单选按钮。我想要实现的是,该方法应该根据所选的radioButton返回已解决的承诺。例如,如果我选择radioButton1,则不应执行第一个then(),并且该方法应返回radioButton1的已解析承诺 如果选择radioButton2,则不应执行secondthen(),并且该方法应为radioB

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

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

如果选择radioButton2,则不应执行second
then()
,并且该方法应为
radioButton2
返回已解析的承诺

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

代码1

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);
  }));
}

通常在这种情况下,您会使用,它订阅您给它的数组中的承诺,并基于第一个要结算的承诺进行结算(结算或拒绝):

…但这似乎不是承诺的用例;事件发生不止一次,但承诺只能解决一次。另外,
this.onRadioButton1Changed.bind(this)
是一个no-op,您不会将绑定函数保存到任何地方

或避免重复:

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});`
  })
});
然后


这看起来不像是承诺的用例;事件发生不止一次,但承诺只能解决一次。另外,
this.onRadioButton1Changed.bind(this)
是一个no-op,您没有将绑定函数保存到任何地方…我不确定我是否理解您试图实现的目标。为什么不绑定这两个事件并解决事件处理程序中需要发生的任何事情?请告诉我什么不起作用mean@LetsamrIt-“无操作”指的是什么都不起作用的东西。请你解释一下这是什么意思。bind(这)不是op?为什么每次调用initiComponents()时都要保存对它的引用?我想正如您发布的第一段代码中提到的,每次调用initComponents()时,我们都会进行绑定?我希望我的观点是明确的,并且please@LetsamrIt-
bind
创建并返回一个新函数,该函数在调用时将使用特定的
this
调用原始函数。因为您没有使用
bind
的返回值,所以该工作最终将一事无成<代码>绑定不会修改调用它的函数,它会创建一个返回的新函数。使用
一次
而不是
打开
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)
  ]);
}