我有很多問題與我的Asyncronous調用存儲,在我的console.log它顯示第一行50,然後行20 ...我想避免這一點。StorageService返回回調Ionic2/Angular2
我有一個服務,我打電話給我的存儲,但所有返回一個承諾,並在任何地方我打電話給他們,我必須做.then().catch()
所以它給我的問題...我怎麼能做到這一方法返回一個回調?所以我可以打電話給我的方法,不要考慮Asyncronous?
我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?
我失蹤了什麼?
所以你想你的諾言/觀察到的調用轉換成一個同步?我不認爲這是一個好主意,你我不會這樣做 – crash
然後@crash你能告訴我如何使用promise/observable調用來獲取值嗎? – Stuart2041
它取決於你想如何使用它,沒有真正的需要將其轉換爲可觀察的......你可以用'Observable.fromPromise()'來實現它,但它的行爲方式與承諾相同,你可以利用所有可觀察的方法,所以你會有很大的靈活性,但它會異步 – crash