storageservice返回回调ionic2/angular2



我在储物中的异步呼叫,在我的控制台上遇到很多问题。这个。

我有一项服务,我可以打电话给我的存储空间,但所有人都返回了一个诺言,我在任何地方都必须做.then().catch(),所以它给我带来了问题...我该如何做到这一点,方法是通过回调返回?所以我可以打电话给我的方法,不要考虑异步吗?

我的StorageService的一个示例是

import { Injectable } from '@angular/core';
import { Http, Headers, Response } from '@angular/http';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/toPromise';
//Storage
import { Storage } from '@ionic/storage';

@Injectable()
export class StorageServiceProvider {
    constructor(public http: Http, private storage: Storage) {
    }
    saveUser(user) {
        if (user== null) return;
        var userToSave= { "id": user["id"], "info": user["info"] };
        this.storage.set('userStored', JSON.stringify(userToSave));
    }
    //I'd like to do it like this, but I can't because Asyncronous so I have to do it like this.storage.get('userStored');
    getUserId() {
        this.storage.get('userStored').then((idUser) => {
            return JSON.parse(idUser["id"]);
        })
            .catch((err: any) => {
                console.log("Err");
            });
    }
    //I'm testing this now
    getUserInfo() {
        return this.storage.get("userStored");
    }
    //RestsLocalStorage
    resetLocalStorage() {
        this.storage.clear();
    }
}

,例如,我想拥有一种返回我的id和其他info的方法,但只知道如何获得object ...

组件的调用就是这样...

this.storageServiceProvider.getUserInfo().then((information) => {
    var infoStored = JSON.parse(information)["info"];
    console.log(infoStored );
    //if..else
  })
    .catch((err: any) => {
      console.log("Error");
    });
 }

,在其他方法中,我需要打电话给他们两个...然后我想避免2并抓住...我想这样做:

let userInfo= this.storageServiceProvider.getUserInfo;
let userId= this.storageServiceProvider.getUserId;

我有一个旧的项目(Ionic1/Angluar1(,我做了这样的事情:

angular.module('app.storageServices', [])
.factory ("storageService", ['$localStorage',function ($localStorage) {
    var saveUser = function (user) {      
      if(user==null) return;
      $localStorage.userId=user.id;
      $localStorage.userInfo=user.info;
    };
    var getIdUser = function () {
      if($localStorage.userId!=null){
        return $localStorage.userId;    
      }
      return null;
    };
    var getInfoUser = function () {
      if($localStorage.info!=null){     
        return $localStorage.info;  
      }
      return null;
    };
    return {
        saveUser: saveUser,
        getIdUser: getIdUser,
        getInfoUser: getInfoUser       
    };
}])

我只是在调用这样的方法:

this.myTestFunction=function(success,error){
    var userId=storageService.getUserId();
    if(userId!=null && userId!=""){
        var userInfo=storageService.getUserInfo();
        //if..else 
    }else{
        console.log("error");           
    }       
}

所以我可以有类似> = ionic2和> = angular2的旧项目吗?

我缺少什么?

使用异步代码时,您无法创建同步调用。异步代码的重点是您没有立即结果,因此您必须等到它可用。

没有办法。

在您的示例中,我不明白您为什么有两种不同的方法,一种用于userId,一个用于userInfo。因为两个值都存储在同一地点,您可以只使用getUserInfo(),然后访问idinfo或您需要的任何属性。

但是,假设您的代码只是一个示例,您确实需要多个获得功能。您有2个选项:

在您的StorageServiceProvider中,您返回承诺。

getUserId() {
    return this.storage.get('userIdStored');
}
getUserInfo() {
    return this.storage.get("userInfoStored");
}

然后,您可以使用Promise.all()等待所有承诺立即解决。

Promise.all([this.storageServiceProvider.getUserId(), this.storageServiceProvider.getUserInfo()])
.then(values => {
  console.log(values); // [userId, userInfo]
});

另一个选项是使用新的async/await语法:

async function() {
  let userId = await this.storageServiceProvider.getUserId();
  let userInfo = await this.storageServiceProvider.getUserInfo()
  // Note: This is synchronous, so the 2 Promises are not executed in parallel. Read more here: https://medium.com/@bluepnume/learn-about-promises-before-you-start-using-async-await-eb148164a9c8
}

编辑:

如果您只能获得用户ID,则必须创建自己的诺言并以所需的价值解决:

getUserId() {
  return new Promise((resolve, reject) => {
    this.storage.get('userInfo')
      .then(user => {
        resolve(user.id);
      })
      .catch(reject);
  });
}

getUserId()现在将解决与用户ID解决的承诺,因此您可以这样使用:

this.storageServiceProvider.getUserId().then(id => {
  console.log(id); // UserID
})

async myFunction() {
  let userId = await this.storageServiceProvider.getUserId();
  console.log(userId);
}

相关内容

  • 没有找到相关文章

最新更新