返回无效函数

时间:2018-10-18 07:36:37

标签: angular typescript

我有一个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;
}

也许有人可以给我一些提示。

3 个答案:

答案 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个电话有关。因此,与ObservableCallbackSubscription一起玩非常重要。

由于read已经返回了Observable,因此您无需创建新的Observable。

需要更改什么?

因此需要在您的代码中进行更改。一切都很好,除了您调用它的方式。不要返回该值,而应让它返回Observable

解决方案1 ​​

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.
});

解决方案2

如果您想在每次收到新数据时通知您,那么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中,因此您无需在此处返回任何内容。