【发布时间】:2017-06-30 21:02:31
【问题描述】:
我对存储的异步调用有很多问题,在我的 console.log 上它显示第一行 50,然后是第 20 行...我想避免这种情况。
我有一项服务,我调用了我的存储,但所有调用都返回一个 Promise 并且在我调用它们的任何地方我都必须执行.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 的东西?
我错过了什么?
【问题讨论】:
-
所以您想将您的 promise/observable 调用转换为同步调用?我不认为这是一个好主意,我不会这样做
-
那么@crash 你能告诉我如何使用 promise/observable 调用获取值吗?
-
这取决于您想如何使用它,没有真正需要将其转换为可观察的...您可以使用
Observable.fromPromise()来完成它,但它的行为方式与承诺相同,您可以利用可观察对象的所有方法,因此您将拥有很大的灵活性,但无论如何它都是异步的
标签: angular typescript ionic-framework ionic2