我有一个会返回承诺的方法。如下所示,有两个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);
}));
}
答案 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)
]);
}