2017-02-04 2 views
0

В моем компоненте у меня есть функция сохранения, как показано ниже:Угловое 2 значение от службы не доступны за пределами подписываться функции

save() { 
    var result; 
    //For updating task 
    if (this.task.AllTaskId) { 
     if (this.task.AssignedToCode == null) { 
      this.task.AssignedToCode = "All"; 
     } 
     this.task.CreatedDate = new Date(); 

     this.task.CreatedBy = this.empcode; 
     result = this._tasksService.updateTask(this.task).subscribe(
      res => { 
       this._router.navigate(['/regtask']) 
      } 
     ) 
    } 
    //For Adding new task 
    else { 
     if (this.task.AssignedToCode == null) { 
      this.task.AssignedToCode = "All"; 
     } 
     this.task.CreatedDate = new Date(); 
     this._tasksService.addTask(this.task) 
      .subscribe((ntask) => { 
       this.emitntask.emit(ntask); 
       this._router.navigate(['/regtask']); 
       this.temp = ntask.allTaskId; 
       console.log(this.temp); 
      }) 
     debugger; 
     console.log(this.temp); 
    } 

    this.compform.reset(); 
} 

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

enter image description here

Может ли кто-нибудь предложить мне, что делать и почему is.temp 'становится недоступным, пока он доступен мне в функции .subscribe?

+0

Возможный дубликат [Как вернуть ответ от асинхронного вызова?] (Http://stackoverflow.com/questions/14220321/how-do-return-the-response-from-an-asynchronous- вызов) – jonrsharpe

ответ

2

Это потому, что обратный вызов, который вы передаете subscribe(), запускается ASYNCHRONOUSLY.

Попробуйте запустить следующий код:

// Some observable that takes a little while to complete (could be an HTTP request). 
const obs = Observable.interval(200).first(); 

// Some callback that you want to execute when the obs emits/completes. 
const callback = (val) => console.log('callback'); 

// Subscribe and log to console right after subscribing. 
obs.subscribe(callback); 
console.log('after subscribe'); 

Вы увидите это в консоли:

"after subscribe" 
"callback" 

Обратный вызов выполняется ПОСЛЕ код, который приходит сразу после obs.subscribe().

2

Потому что это асинхронный код. Второй console.log(this.temp) на самом деле происходит до первый, потому что тот обернут в вызов subscribe(), который выполняется только после завершения addTask (возвращает значение). Второй выполняется сразу же.

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