2016-12-28 1 views
3

Я пытаюсь вызвать веб-сервис в приложении с ионной 2, но получить между обещаниями и наблюдаемыми. Это моя функция, я звоню по щелчку Button-Использование обещаний с наблюдаемыми в ионных приложениях 2

getUserDetailsIfAccessTokenIsSuccess() 


{ 
    this.remedyService.userGetDetail(this.loginDetailsObj.username).subscribe(
     data =>{ 
     console.log("userGetDetail Success="+JSON.stringify(data)); 
     }, 
     err =>{ 
     console.log("userGetDetail Success="+JSON.stringify(error)); 
     }, 
     () =>{ 
       console.log("Get Userdetails Completed"); 
     }); 
} 

Теперь я звоню функцию userGetDetail в моем файле службы.

userGetDetail(eid){ 
    var url = '/userGetDetail'; 
    var params = { 
       'EID':eid 
      }; 
    console.log(JSON.stringify(params)); 
    var headers = new Headers(); 
    this.createAuthorizationHeader(headers); 
    this.storage.get('remedyAccessToken').then((value)=>{ 
     var token = value.toString(); 
     console.log("TOKEN IN REMEDYSERVICES="+token); 
     headers.append('Authorization', token); 
     console.log("header value inside="+JSON.stringify(headers)); 
    }) 
    console.log("header value outside="+JSON.stringify(headers)); 
    let options = new RequestOptions({ headers: headers }); 
    this.response = this.http.post(url,this.urlEncode(params),options).map(res => res.json()); 
    console.log("Response JSON="+JSON.stringify(this.response)); 
    return this.response; 
} 

Теперь вопрос заключается в том, что до авторизации становится добавляется в заголовок потока будет следующей строки и веб-API дает ошибку. Есть ли в любом случае, я могу синхронизировать таким образом, что после добавления авторизации происходит только служебный вызов. Я попытался поместить вызов веб-ави, внутри, затем заблокировать, но это заставляет службу звонить как обещание. Любая помощь будет оценена по достоинству.

ответ

-1

Правильный способ вызова наблюдателя внутри обещания и возвращение наблюдатель будет как this-

return Observable.fromPromise(this.storage.get('remedyAccessToken')).then((value)=>{ 
    var token = value.toString(); 
    console.log("TOKEN IN REMEDYSERVICES="+token); 
    headers.append('Authorization', token); 
    console.log("header value inside="+JSON.stringify(headers)); 
    console.log("header value outside="+JSON.stringify(headers)); 
    let options = new RequestOptions({ headers: headers }); 
    this.response = this.http.post(url,this.urlEncode(params),options).map(res => res.json()); 
    console.log("Response JSON="+JSON.stringify(this.response)); 
    return this.response.toPromise(); 
}) 
+0

Я не вижу оператора '' get'' в '' Observable''. http://reactivex.io/documentation/operators.html – raj

+0

обновлен до тех пор, пока метод обещания ... это была ошибка – RHUL

+0

В решении есть дополнительный кронштейн. И отметьте ответ, чтобы он был полезен другим. – raj

3

Вам необходимо получить доступ к api внутри storage.get. Это гарантирует, что значение будет доступно при вызове api. Затем конвертируйте вызов api, который является Observable, чтобы пообещать toPromise(). Теперь вы можете получить ответ как Promise. Вот приблизительный рабочий процесс из вашего кода.

this.storage.get('remedyAccessToken').then((value)=>{ 
    var token = value.toString(); 
    console.log("TOKEN IN REMEDYSERVICES="+token); 
    headers.append('Authorization', token); 
    console.log("header value inside="+JSON.stringify(headers)); 
    console.log("header value outside="+JSON.stringify(headers)); 
    let options = new RequestOptions({ headers: headers }); 
    this.response = this.http.post(url,this.urlEncode(params),options).map(res => res.json()); 
    console.log("Response JSON="+JSON.stringify(this.response)); 
    return this.response.toPromise(); 
}) 



this.remedyService.userGetDetail(this.loginDetailsObj.username).then(fn).catch(fn); 

или если вы хотите выход быть Observable следовать этому подходу.

Observable.fromPromise(this.storage.get('remedyAccessToken')).flatMap((value)=>{ 
     var token = value.toString(); 
     console.log("TOKEN IN REMEDYSERVICES="+token); 
     headers.append('Authorization', token); 
     console.log("header value inside="+JSON.stringify(headers)); 
     console.log("header value outside="+JSON.stringify(headers)); 
     let options = new RequestOptions({ headers: headers }); 
     this.response = this.http.post(url,this.urlEncode(params),options).map(res => res.json()); 
     console.log("Response JSON="+JSON.stringify(this.response)); 
     return this.response 
}) 

Этот подход позволяет достичь желаемого результата.

+0

Привет Радж, есть в любом случае я могу преобразовать обратный this.response наблюдатель? – RHUL

+0

Я обновил его с помощью альтернативного подхода. – raj

+0

HI Raj, я думаю, flatMap не является гарантией обещания <>, мое хранилище возвращает обещание, поэтому flatMap нельзя использовать здесь. – RHUL

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