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

#angular #cordova #typescript #ionic2 #ionic3

#angular #кордова #typescript #ionic2 #ionic3

Вопрос:

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

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

Ответ №1:

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

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

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

И затем

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

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

Комментарии:

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

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