2016-11-13 2 views
-1
 getEmployee(id : number) : void{ 
     var e : Employee; 
     this.http.get(this.employeesUrl + '/' + id) 
     .map(response => <Employee>response.json()) 
     .subscribe((res) =>{e = res}, 
          (err)=>console.log(err), 
         ()=>console.log("Done")); 

    console.log(e.Name); 

} 

Это res, возвращаемый делать console.log(res) печатает employee объект правильно. Но когда я пытаюсь назначить его переменной, она дает мне ошибку страницы. Хотя он печатает Done в конце. Проведено 3 часа. на эти и прошли через много SO постов, но не могу понять егоУгловое 2 наблюдаемыми не назначая возвращаемый объект переменной

+1

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

ответ

1

При входе в ответ, как

var e : Employee; 
    this.http.get(this.employeesUrl + '/' + id) 
    .map(response => <Employee>response.json()) 
    .subscribe((res) =>{e = res}, 
         (err)=>console.log(err), 
        ()=>console.log("Done")); 

console.log(e.Name); 

Конечно, вы увидите статус пустой/ошибку, так как приведенный выше код (this.http.get) является асинхронным. Если вы делаете запрос, то вы ожидаете ответа внутри subscribe, и когда это произойдет, вы назначите e на номер res или распечатайте все, что захотите. Во время ожидания вы уже регистрируетесь (e.Name). И так как "e" изначально не определено, e.Name - это ошибка.

Вместо этого попробуйте это и проверьте журнал,

var e : Employee; 
    this.http.get(this.employeesUrl + '/' + id) 
    .map(response => <Employee>response.json()) 
    .subscribe((res) =>{ 
       e = res; 
       console.log(e.Name); 
       }, 
       (err)=>console.log(err), 
      ()=>console.log("Done")); 

Что вы должны сделать:

Пусть этот метод возврата наблюдаемым и позволяет сказать, название компонентов является GetEmployeeService,

getEmployee(id : number) : Observable<Employee>{ 
     return this.http.get(this.employeesUrl + '/' + id) 
     .map(response => <Employee>response.json()) 

} 

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

constructor(..., private myService: getEmployeeService) 

... 
//the place where you need the response 
this.myService.subscribe((res)={ 
    console.log(res); 
    //do something with res here 
    this.field = res; 
}) 
+1

он работает, но как я могу вернуть этот объект классу, который вызывает эту услугу ??? –

+0

@mohit настройка неверна, вы не должны подписываться на это наблюдаемое здесь. Я обновлю свой ответ – echonax

+0

, пожалуйста, воздержитесь от моего вопроса, если бы это было хорошо –