2017-02-17 5 views
0

У меня есть служба аутентификации, которая сохраняет токен, и результат сохранения токена - это обещание. Я хотел бы, чтобы значение возвращалось к другой функции только после того, как обещание было разрешено.Выполнение наблюдаемого только в том случае, когда обещание разрешено в угловом2/ionic2

Это мой authservice, который сохраняет маркер:

login(user: UserModel): Observable<any> { 
    return this._http.postnoAuth(this.loginurl + "mobile-login", body) 
     .map((response: Response) => { 
      let token = response.json() && response.json().access_token; 

      if (token){ 
       this._storage.set('currentUser', JSON.stringify({token: token})) 
       .then(res=>{ 
        return true; //return true after the promise is resolved 
       }); 
      } 
      else{ 
       return false; 
      } 
     }) 
    //.catch(this.handleError); 
} 

Тогда я подписавшись выше:

this._authservice.login(this.user).subscribe(respose => { 
    if(response){ //expecting true here 
     console.log("true"); 
    } 
    else{ 
     console.log("false"); 
    } 
    loader.dismiss(); 
     this.submitted = false; 
    }, 
    error=> { 
     this.submitted = false; 
    } 
); 

Приведенный выше код всегда регистрирует ложные, даже когда значение хранения было установлено , Что может быть неправильным?

ответ

1

Я бы постарался сделать это с помощью оператора flatMap. Оператор flatMap помогает нам вызвать один запрос после предыдущей завершенная:

Не Foget этот импорт:

import { Observable } from 'rxjs/Observable'; 
import 'rxjs/add/operator/map'; 
import 'rxjs/add/operator/mergeMap'; 
import 'rxjs/add/observable/of'; 

Plunker Example

0

Вы возвращающиеся как наблюдаемом и логическое значение от Login(). Решите, что вы хотите вернуть.

Если вы хотите, логическое значение, переопределить ваш метод следующим образом:

login(user: UserModel): Boolean { 
    this._http.postnoAuth(this.loginurl + "mobile-login", body) 
     .map((response: Response) => { 
      let token = response.json() && response.json().access_token; 

      if (token){ 
       this._storage.set('currentUser', JSON.stringify({token: token})) 
       .then(res=>{ 
        return true; 
       }) 
       .catch((err) => { 
        console.log("Some error while setting storage :", err); 
        return false; 
       }); 
      } 
      else{ 
       return false; 
      } 
     }) 
    //.catch(this.handleError); 
} 

или вернуть наблюдаемым. Теперь я не уверен, что postnoAuth() уже возвращает наблюдаемый. Если это не так, вы можете создать новый, как я ответил here. Например. введите код в Observable.create(observer => {},(err)=>{});. Затем подпишитесь на login() по вашему методу вызова и установите для хранения здесь. Итак, ваше обещание будет в методе вызова. Ваш код будет так:

login(user: UserModel): Observable<any> { 
    return Observable.create(observer => { 
     this._http.postnoAuth(this.loginurl + "mobile-login", body) 
     .map((response: Response) 
     .subscribe(data => { 
      observer.next(data); 
     }, 
     (err) => { 
      observerer.error(); 
     } 
    }); 
} 

И подписаться с вызова метода:

this._authservice.login(this.user).subscribe(respose => { 
    let token = response.json() && response.json().access_token; 
    if (token){ 
     this._storage.set('currentUser', JSON.stringify({token: token})) 
     .then(res=>{ 
      console.log(res); 
     }) 
     .catch((err) => { 
      console.log("Some error while setting storage :", err); 
     }); 
    } 
); 

Я думаю, за то, что вы ищете 1-й метод в моем ответе должен работать. Но второй метод - это то, что я хотел бы предложить. Поток намного легче во 2-м. Твой выбор.