nativeStorage в ionic 2 и провайдерах

Я хочу сохранить токен в локальном хранилище и, если он существует, немного изменить его, а затем использовать на странице.

С ionic 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() есть все остальное, что я хочу сделать?


person user1139675    schedule 05.10.2016    source источник


Ответы (1)


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

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

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

А потом

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

ОБНОВЛЕНИЕ: ответ был обновлен в соответствии с комментарием @SamMason.

person sebaferreras    schedule 06.10.2016
comment
ваш getToken() выглядит излишне сложным. Почему не просто return NativeStorage.getItem('token').then(data => data + 'modified')? Цепочка обещаний красиво! - person Sam Mason; 06.10.2016
comment
@SamMason, ты абсолютно прав; Я обновил ответ с вашим предложением. Большое спасибо :) - person sebaferreras; 06.10.2016