2016-03-02 2 views
-1

У меня есть страница и служба в угловых 2.Угловых 2 HTTP многих абонентов

Когда я вызвать функцию службы this.Auth.login(), он делает запрос HTTP POST. Моя проблема заключается в том, что как только запрос возвращает данные, я хочу работать с этими данными в сервисе И на странице.

Я пробовал все виды вещей, но не мог понять, как это сделать.

Я знаю, что мой код не может работать так, потому что прямо сейчас this.Auth.login() возвращает объект подписчика. Если я удалю «.subscribe()» в службе, он будет работать на странице. Но это не то, что мне нужно.

Я также попытался вернуть обещание, но не смог заставить его работать.

Кто-нибудь знает, как я могу достичь данных из http.post в обоих контроллерах и работать с ним, как только запрос будет завершен?


Вот мой код

Страница:

import {AuthService} from '../auth/auth.service'; 

@Page({ 
    templateUrl: 'build/pages/signin/signin.html' 
}) 
export class Signin { 

    constructor(app: IonicApp, auth: AuthService){ 
     this.Auth = auth; 
    } 

    signIn = function() { 
     this.Auth.login(this.user.email, this.user.password) 
      .subscribe(data => {do some stuff here}); 
     // maybe a promise with .then can solve this 
    }; 
} 

Услуги:

import {Http, Headers} from 'angular2/http'; 
import {Injectable} from 'angular2/core'; 

@Injectable() 
export class AuthService { 
    private http; 

    constructor(http:Http) { 
     this.http = http; 
    } 

    login(email, password) { 
     let headers = new Headers(); 
     headers.append('Content-Type', 'application/json'); 

     // maybe i need to return this as a promise 
     return this.http.post('http://localhost:9000/auth/local', JSON.stringify({ 
        email: email, 
        password: password 
       }), { 
        headers: headers 
       }) 
       .subscribe(data => { 
        do some stuff here too with the data 
       )); 
       // i tried to add .toPromise() but that didn't work 
    } 
} 

я ушел из других строк кода, поэтому могут быть некоторые зависимости отсутствуют. Это все хорошо.

ответ

2

Вы можете использовать map в корпусе Servicelogin. т.е.

.map(data => { 
       do some stuff here too with the data 
       // still bubble up 
       return data; 
      )); 
+0

Я попробовал и я получаю ошибку 'this.http.post (.. .). map не является функцией'. –

+0

добавить импорт 'rxjs/add/operator/map'; в AuthService – Abdulrahman

+0

Правильно ли сказать, что обратный вызов 'map' не будет выполнен, если только что-то не вызывает' subscribe() '(в этом случае показан сервис)? Если это так, то об этом следует знать, если вы полагаетесь на что-то делать с данными независимо от того, вызывает ли вызывающий код 'subscribe()' на наблюдаемом. – GregL

-1

Хорошо, я не знаю, если это законно, но это, кажется, работает для меня:

var res = this.http.post('http://localhost:9000/auth/local', JSON.stringify({ 
     email: email, 
     password: password 
    }), { 
     headers: headers 
    }); 

res.subscribe(
    data => { 
     console.log('data'); 
    }, 
    err => { 
     console.log('err'); 
    }, 
    () => { 
     console.log('next'); 
    } 
); 

return res; 
+0

'.map()' должен работать (т. Е. Ответ @ basarat). Вот рабочий плункер: http://plnkr.co/edit/vVL2oskhgH781PUz4yd6?p=preview –

Смежные вопросы