2017-01-19 1 views
0

Я пытаюсь найти ID из таблицы в моей базе данных, обратившись к моему серверу с помощью специального запроса. Однако, когда я отправляю GET Method с моей службой и subscribing на номер Observable, это won't assign ответ (который является только числом), к моему property класса обслуживания. Вот мой код:Angular2: Подписка на Observable не присваивает значение ответа

rentedCarId:string; 


    getId(id:number): void { 
    let url = this.baseUrl+"/search/findRentedCar?customer="+sessionStorage.getItem("customerID")+"&car="+id; 

    console.log("Input id: " + id); 

    let headers = new Headers(); 
    headers.set('Accept', 'application/json'); 

    this 
     .http 
     .get(url, {headers}) 
     .map(resp => resp.text()) 
     .subscribe(
     (id) => { 
      console.log(id); //This will print out the number! 
      this.rentedCarId = id; //This won't work! => undefined 
     }, 
     (err) => { 
     console.error('Error while searching for rentedCar ID!', err); 
    }); 

    } 




    deleteRentedCarEntry(id:number){ 
     this.getId(id); 
     console.log("ID of Row in RentedCars table (response): " + this.rentedCarId); //will be undefined! 
    } 

Метод deleteRentedCarEntry() выполняется из другого компонента. Если я запустил его в начале заявки, log в deleteRentedCarEntry() возвращает undefined для rentedCarId! console.log в методе subscribe однако записывает правильное значение даже в первый раз! Почему он не присваивает значение id из ответа после первого раза, но только во второй раз?

+0

Вам необходимо вернуть наблюдаемый в getId, а когда вы вызываете его в deleteRentedCarEntry, подпишитесь на это наблюдаемое, а затем распечатайте его. – Steveadoo

+0

@Steveadoo Это будет иметь тот же эффект, что и сейчас. Единственное, что изменилось бы, это то, что я бы подписался в другом методе, и вот он! Кстати, это тоже не работает! – Bajro

+0

Нет, прямо сейчас вы немедленно пытаетесь зарегистрировать rentedCarId, прежде чем HTTP-запрос когда-нибудь вернется. 'this.rentedCarId = id;' вызывается после 'console.log (« ID строки в таблице RentedCars (response): «+ this.rentedCarId); // будет неопределенным! ' – Steveadoo

ответ

2

Используйте a do, чтобы установить rentedCarId.

getId(id:number): Observable<any> { 
    let url = this.baseUrl+"/search/findRentedCar?customer="+sessionStorage.getItem("customerID")+"&car="+id; 

    console.log("Input id: " + id); 

    let headers = new Headers(); 
    headers.set('Accept', 'application/json'); 

    return this 
     .http 
     .get(url, {headers}) 
     .map(resp => resp.text()) 
     .do(id => this.rentedCardId = id); 
    } 

    deleteRentedCarEntry(id:number){ 
     this.getId(id).subscribe((rentedCarId) => { 
      console.log("ID of Row in RentedCars table (response): " + this.rentedCarId); //will be undefined! 
     }); 
    } 
+0

Конечно, мне это нужно! 'Log' свойства' rentedCarId' в 'deleteRentedCarEntry' предназначался для целей отладки. Вот и мой вопрос! Я хочу сохранить значение из возвращаемого 'Observable', а не только' log' его на консоль. – Bajro

+0

Хорошо, но вы отлаживали неверно. Он выходил как неопределенный, потому что вы выполняли его сразу же, вместо того, чтобы ждать, пока наблюдаемый завершится. Я отредактирую свой ответ. – Steveadoo

+0

О, ладно, я вижу! Поэтому при использовании 'Observables' вы можете' .subscribe() 'им, но в методе' subscribe() 'он не будет хранить данные в свойстве, если он еще не завершил загрузку ... и' Метод do() 'ждет, пока он не вернется? Спасибо за ваше решение, это очень хорошо! – Bajro

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