我在储物中的异步呼叫,在我的控制台上遇到很多问题。这个。
我有一项服务,我可以打电话给我的存储空间,但所有人都返回了一个诺言,我在任何地方都必须做.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()
,然后访问id
,info
或您需要的任何属性。
但是,假设您的代码只是一个示例,您确实需要多个获得功能。您有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);
}