简体   繁体   中英

Ember RSVP Promise resolve always returns undefined value

I'm using Ember-simple-auth and trying to return data from my custom authenticator back into the controller that did the authenticating.

in my authenticator/custom.js:

  authenticate(identification, password) {
      return  new Ember.RSVP.Promise(function (resolve, reject) {
          var loginURL = 'https://domain.com/login';    
          var authObj = Ember.Object.create({"identity":identification,"password":password});
          var hash = authObj.getProperties('identity', 'password');
          var stringHash = JSON.stringify(hash);

              var xhr = new XMLHttpRequest();
              xhr.open("post", loginURL);
              xhr.onreadystatechange = handler;
              xhr.responseType = 'json';
              xhr.setRequestHeader('Content-Type', 'application/json');
              xhr.setRequestHeader('Format', 'JSON');
              xhr.send(stringHash);

              function handler() {
                if (this.readyState === this.DONE) {
                  if (this.status === 200) {
                    console.log('response is: ',this.response); /// <-- returns good response data
                    resolve(this.response);
                  } else {
                      reject( 'failed with status: [' + this.status + ']');

                  }
                }
            }

and in my login controller:

 authenticate() {
  let { identification, password } = this.getProperties('identification', 'password');

  var session = this.get('session');
  session.authenticate('authenticator:custom', identification, password).then((reason) => {
            console.log('failed login',reason);
        });   
    }
},

But I'd really like to be able to handle the resolve function and get it's value payload from the authenticate promise.

If I change the .catch to a .then the response function is successfully called but always has an undefined value as its payload:

  session.authenticate('authenticator:custom', identification, password).then(
      (response) => {
          console.log('response: ',response); //// <---- always 'undefined'
            this.setUserWithData(response);
        },
      (reason) => {
            this.set('Login failed: ',reason);
        }       

    );    
    }

Even if I restructure the promise, rearrange how the function is called, the first function from an RSVP is successfully called, but has an undefined payload. The second function from an RSVP always has a correct payload.

I tried reversing the resolve/reject:

Ember.RSVP.Promise(function (resolve, reject){

to

Ember.RSVP.Promise(function (reject, resolve){

and the function successfully carries the response, but the simple-auth now believes it has failed its authorization.

I'd like to be able to pass the response payload into my controller. Or, if that can't be done, how can I inject data from the response into my session and ember-data store? It didn't seem like good practice to call and insert data into the store from within the authenticate function of the authenticator.

The session's authenticate method doesn't resolve with a value. Check the API docs: http://ember-simple-auth.com/api/classes/SessionService.html#method_authenticate

In order to deal with the response from the authentication route, I used the function sessionAuthenticated to deal with the returned data.

So, the authenticate function in authenticators/custom.js

  authenticate(identification, password) {

      return  new Ember.RSVP.Promise(function (resolve, reject) { 

          var loginURL = 'https://domain.com/login';    
          var authObj = Ember.Object.create({"identity":identification,"password":password});
          var hash = authObj.getProperties('identity', 'password');
          var stringHash = JSON.stringify(hash);

              var xhr = new XMLHttpRequest();
              xhr.open("post", loginURL);
              xhr.onreadystatechange = handler;
              xhr.responseType = 'json';
              xhr.setRequestHeader('Content-Type', 'application/json');
              xhr.setRequestHeader('Format', 'JSON');
              xhr.send(stringHash);

              function handler() {
                if (this.readyState === this.DONE) {
                  if (this.status === 200) {
                    console.log('200 response: \r',this.response);
                    resolve(this.response);
                  } else {
                    console.log('failure response',this.response);
                      reject(this.response);
                  }
                }
            }
        });

  },

With the sessionAuthenticated() event taking place in routes/application.js :

sessionAuthenticated: function(){
    var session = this.get('session');
    var data = session.get('data');
    var response = data.authenticated;
    console.log('sessionAuthenticated()',response);
},
sessionInvalidated: function(){
    console.log('sessionInvalidated()',response);
},

From the sessionAuthenticated function, the response variable contains all the information passed to it from authenticate(response) inside the authenticator.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM