2017-01-30 4 views
0

Я пытаюсь извлечь значения из наблюдаемых, моя подписки (компонент) код, как следует:Наблюдаемые Неопределенное

this.checkoutService.getDisabledDate().subscribe 
(dates=>{this.formattedDate=dates}, 
(error:any)=>{console.log(error)}); 

В обратном вызове «дат» console.log из this.formattedDate печатает правильные значения. Однако попытка доступа к this.formattedDate вне подписки не определена.

код службы:

getDisabledDate():Observable<any>{ 
    let headers = new Headers({'Content-Type': 'application/json' }); 
    let options = new RequestOptions({headers:headers}); 
    let userRequest={action_id:0}; 
    let disabledDate={}; 

    return this.http 
     .post(this.deliveryUrl,userRequest,options) 
     .map((r:Response)=>r.json()) 
     .catch(this.handleError); 
} 

Я выполнил то же действие передачи данных по queryParam, используя короткую форму(), и это не имеет никакого значения в данном случае. Я, кажется, не замечаю, что нужно, чтобы вытащить информацию с этим.

Я посмотрел на обоих: Angular2 HTTP using observables subscribe showing data undefined и Angular 2 return data from service is not availabe after RxJs subscribe.

Который я передал, когда на их вопросы был дан ответ. Что мне не хватает?

+0

Как пытаетесь получить доступ к этим данным? С вашей точки зрения? Вы использовали * ngIf, как это предлагается в одном ответе, если это так? – Alex

+1

Похоже, вы пытаетесь получить доступ к данным, прежде чем они будут доступны. Он доступен только ПОСЛЕ того, как наблюдаемое возвращает значение для него. Вы уверены, что наблюдаемое возвращается, то есть '' this.formattedDate = dates' вызывается, прежде чем пытаться получить к нему доступ? Это мое лучшее предположение. – VSO

+0

Это технически обман того, как вернуть значение из асинхронной функции. –

ответ

1

Неясно из вашего вопроса, где «снаружи», но если это после вызова, где вы получите Observable то это ожидаемое поведение

someMethod() { 
    this.checkoutService.getDisabledDate() 
    .subscribe(
    // anything here is executed sometimes later when the response from the server arrives 
    dates=>{ 
     this.formattedDate=dates; 
     // code that depends on the result goes here 
    }, 
    (error:any)=>{console.log(error)} 
); 
    // this is executed first 
} 

Вы не можете получить значение вне subscribe. Вы можете использовать map и вернуть результат для подписчика, который будет подписаться, например, сделано в getDisabledDate или переместить код в один из обратных вызовов.

+1

Я понял, что асинхронный характер будет означать, что код, выполненный по тому же методу, завершится до наблюдаемого. Я думал, что перенос подписки на конструктор оставит время для formattedDate, чтобы получить значения из наблюдаемого в ngOnInit. Оказывается, я был неправ. Я переместил console.log (this.formattedDate) на кнопку, и вот он напечатал значения. – Chris

+1

@Chris: Вы хотите видеть, что Angular 2 Route разрешает предварительно загружать данные, необходимые в вашем контроллере. Решение гарантирует, что он будет готов для вас при загрузке контроллера. См. Здесь: http://www.callibrity.com/blog/angular-2-route-resolves или здесь: https://blog.thoughtram.io/angular/2016/10/10/resolving-route-data-in -angular-2.html Первая статья легче читать. Второй - разработчики архитектурного уровня (глубина, сложнее). – VSO

+0

Чтобы прояснить, что я имею в виду под «наружу»: доступ к значениям «this.formattedDate» за пределами .subscribe(); то есть. значения не только локально доступны для наблюдаемого, но и для объема принимающей переменной. – Chris

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