There are lot of things you can do with Promise. Today, I will share my experience on using promise for modal which I recently learned.
If you don't know much about EmberJs or Promise. Please visit EmberJS and 
Promise) to get your basics up
Why Promise?
https://medium.com/javascript-scene/master-the-javascript-interview-what-is-a-promise-27fc71e77261
Prerequisites
ember install ember-bootstrap
ember generate ember-bootstrap --preprocessor=sass
If you want to use less instead of sass use --preprocesor=less. For other config, please check here
Steps
- Create your component using
 
ember generate component promise
- promise.js
 
import Component from '@ember/component';
export default Component.extend({
  // It's important to have response undefined instead of boolean
  response : undefined,
  show     : false,
  actions: {
    promiseClicked() {
      new Promise( respond => {
        this.set( 'show', true );
        this.addObserver( 'response', function observer() {
          this.removeObserver( 'response', observer );
          respond( this.get( 'response' ) )
        });
      }).then( proceed => {
        if ( proceed ) {
          console.log( proceed );
        } else {
          console.log( proceed );
        }
        this.setProperties({ 'show': false, 'response': undefined });
      });
    },
    response( bool ) {
      this.set( 'response', bool );
    }
  },
});
Make sure variable response is set to undefined after removing observer.
- promise.hbs
 
<BsButton @onClick={{action 'promiseClicked'}}> Promise </BsButton>
<BsModal
  @open={{show}}
  @onSubmit={{action "response" true}}
  @onHidden={{action "response" false}} as |modal|>
  <modal.header>
    <h4 class="modal-title">
      Custom Dialog
      <div class="badge">2</div>
    </h4>
  </modal.header>
  <modal.body>
    Promise Example?
    Check console when you click "Cancel or Save".
  </modal.body>
  <modal.footer>
    <BsButton @onClick={{action "response" false}}>Cancel</BsButton>
    <BsButton @type="success" @onClick={{action "response" true}}>Save</BsButton>
  </modal.footer>
</BsModal>
That's it. Thanks!
    
Top comments (0)