Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Javascript: Checking if multiple custom elements are defined via Promises

Hopefully this has not been asked before - I've had a hard time figuring out how to word the question.

I'm playing around with Vaadin's date and time pickers - an example dealing with date ranges is shown here https://vaadin.com/components/vaadin-date-picker/html-examples In that example, customElements.whenDefined('vaadin-date-picker')... is being used to ensure the elements exist.

I'm interested in combining the date picker with the time picker, essentially making a date/time range picker. Therefore, I would need to check that both vaadin-date-picker and vaadin-time-picker exist.

What is the 'correct' way or best practice to handle this combined check?

My first guess was:

customElements.whenDefined('vaadin-date-picker').whenDefined('vaadin-time-picker').then...

But there are no examples showing this approach - as far as I can tell - so I suspect it either is not correct, or simply an uncommon problem. I think a working solution would be

customElements.whenDefined('vaadin-date-picker').then(function() { 
  customElements.whenDefined('vaadin-time-picker').then(function() {
    // insert code here...
  });
});

but this seems quite inelegant.

like image 463
KDM Avatar asked Feb 14 '26 18:02

KDM


1 Answers

One option would be to use Promise.all to create one promise out of the two original ones:

Promise.all([
    customElements.whenDefined('vaadin-date-picker'),
    customElements.whenDefined('vaadin-time-picker')
  ]).then(function() {
  // Do something
});

Another alternative that is in a way even more elegant is to do everything in an async function. Then you can await each promise separately before continuing.

(async () => {
  await customElements.whenDefined('vaadin-date-picker');
  await customElements.whenDefined('vaadin-time-picker');
  // Do something
})();

If you're already inside a function that doesn't have to return anything immediately, then you can just mark that function as async instead of doing a dummy lambda wrapper like in my example.

like image 133
Leif Åstrand Avatar answered Feb 17 '26 06:02

Leif Åstrand



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!