我有一个read()
函数,带有箭头函数作为参数。
如果我实现这样的功能,则该值将在控制台中显示为应有的值。
function(path: string) {
this.db.read(path, val => {
console.log(val.value)
});
}
我的问题是,如何从该函数中获取价值?
我尝试了几种返回方式,但是没有任何效果。
//This is not working...
function(path: string) {
newValue = this.db.read(path, val => {
console.log(val.value)
return val.value;
});
return newValue;
}
//Is working, but not really good...
private newValue;
function(path: string) {
this.db.read(path, val => {
console.log(val.value)
this.newValue = val.value;
});
return this.newValue;
}
也许有人可以给我一些提示。
答案 0 :(得分:4)
尝试这种方法。返回新的Promise而不是您将来会得到的val。:
function readDb(path: string) {
return new Promise(function(resolve, reject) {
this.db.read(path, val => {
resolve(val.value);
});
});
}
this.readDb("/path").then(function(val) { console.log(val) });
答案 1 :(得分:0)
您的案件与Asynchronous
个电话有关。因此,与Observable
,Callback
和Subscription
一起玩非常重要。
由于read
已经返回了Observable,因此您无需创建新的Observable。
因此需要在您的代码中进行更改。一切都很好,除了您调用它的方式。不要返回该值,而应让它返回Observable
。
readData(path){
new Promise((resolve, reject)=>{
this.db.read(path, val => {
let readValue = val.value; //<-- you can choose what you want to return.
resolve(readValue);
});
});
//用法
readData("/path/of/db").then(value=>{
console.log(value); //value is here once the DB call is completed.
});
如果您想在每次收到新数据时通知您,那么Observable可以实现相同的目的。
private _subject:主题=新的Subject();
readData(path){
this.db.read(path, val => {
let readValue = val.value; //<-- you can choose what you want to return.
subject.next(readValue);
});
}
this.subject.subscribe((data) => {
console.log('Data from DB ', data);
});
答案 2 :(得分:-1)
您提供的第二个解决方案是实现该目标的方法。
执行此操作时。newValue = val.value;您会影响从读取函数到变量newValue的值,而这正是您想要的值,因此该值已经在函数之外。
private newValue;
function(path: string) {
this.db.read(path, val => {
this.newValue = val.value;
});
}
由于您已经将值存储在私有变量newValue中,因此您无需在此处返回任何内容。