Reputation: 308
I need to pass an asynchronous function to a keypress event in my html So far without an asynchronous function, my function must return true so that I can write to my input field otherwise I'm stuck
Here is my html
<input type="text" class="form-control" keypress.delegate="onEnterKeyPressedAsync($event)" value.bind="newItem[valueField] & validateForm"
check-field="field:SCHEMA.USER_MAIL;format:alphanum;is-required.bind:true;" maxlength="255">
Here is my typescript file
public async onEnterKeyPressedAsync($event : any) : Promise<boolean> {
if ($event.which === 13 && this.items.length > 0) {
const isValid = await this.addItemFormValidVM.validateAsync();
if (this.saveAsync && isValid) {
this.saveAsync({newItem : this.newItem});
this.newItem = this._initializeNewItem();
this.fieldIsVisible = false;
this.addItemFormValidVM.clear();
}
}
return true;
}
My function is triggered by the keypress event but it blocks input in my input field. I already tried to return Promise.resolve(true) in my function but without success
My function must be asynchronous because I have to wait for a form validation
Currently, I can't write in my input field unless I remove the async from this function
Upvotes: 1
Views: 692
Reputation: 414
To resolve your problem, onEnterKeyPressedAsync must not be an async
function.
They are two ways to do it.
Using then
instead of await
public onEnterKeyPressedAsync($event : any) : Promise<boolean> {
if ($event.which === 13 && this.items.length > 0) {
this.addItemFormValidVM.validateAsync().then(isValid => {
if (this.saveAsync && isValid) {
this.saveAsync({newItem : this.newItem});
this.newItem = this._initializeNewItem();
this.fieldIsVisible = false;
this.addItemFormValidVM.clear();
}
});
}
return true;
}
Or split your code with two function, externalise your async code in another function, then, called it without await :
private async relevantFunctionNameAsync() {
const isValid = await this.addItemFormValidVM.validateAsync();
if (this.saveAsync && isValid) {
this.saveAsync({newItem : this.newItem});
this.newItem = this._initializeNewItem();
this.fieldIsVisible = false;
this.addItemFormValidVM.clear();
}
}
public onEnterKeyPressedAsync($event : any) : Promise<boolean> {
if ($event.which === 13 && this.items.length > 0) {
relevantFunctionNameAsync();
}
return true;
}
Upvotes: 2