2016-10-05 3 views
1

Я хочу хранить токен в локальном хранилище, а если он существует, слегка его настройте, а затем используйте его на странице.nativeStorage in ionic 2 и провайдеры

С ионным 1 было легко создать службу, которая только что получила данные из локального хранилища, изменила ее и вернула, чтобы основной компонент мог с ней справиться.

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

Я хочу быть в состоянии сделать:

export class Test{ 
    let tok = ""; 
    constructor(tokenService:TokenService){ 
     this.tok = tokenService.getToken() 
    } 

    ngOnInit(){ 
     alert(this.tok + " Is your token"); 
    } 
} 

и tokenService провайдера есть:

getToken(){ 
// this doesn't work now because it will return undef for modified_token not waiting for the promise to finish 
    let modified_token:string; 
    NativeStorage.getItem('token').then(
     data=>{ 
      modified_token = data + 'modified'; 
     } 
    ); 
    return modified_token 
} 

ли я просто иметь другую основную функцию, которая вызывается, когда обещание закончено ?

нравится:

getToken(){ 
    return NativeStorage.getItem('token') 
} 

и вместо того, чтобы в конструкторе в ngOnInit есть:

ngOnInit(){ 
tokenService.getToken().then(
    data => { 
     let modified_token = data + "modified"; 
     mainAction(modified_token); 
    }) 
} 

и mainAction() имеет остаток того, что я хочу сделать?

ответ

2

Нужно ли мне иметь еще одну главную функцию, которая называется, когда завершено обещание ?

Это один из способов сделать это. Вы также можете сохранить все связанные логики внутри метода getToken, возвращая новое обещание, как это:

getToken(){ 
    return NativeStorage.getItem('token').then(data => return data + 'modified') 
} 

А потом

ngOnInit(){ 
tokenService.getToken().then(
    modifiedToken => { 
     mainAction(modifiedToken); 
    }) 
} 

UPDATE: ответ был обновлен в соответствии с @SamMason комментарием.

+1

Ваш 'getToken()' выглядит излишне сложным. Почему это не просто «вернуть NativeStorage.getItem (« токен »), а затем (data => data + 'modified')'? Обещает «цепочку» красиво! –

+0

@SamMason вы абсолютно правы; Я обновил ответ с вашим предложением. Большое спасибо :) – sebaferreras