Angular 角度4可观测和离子3-前2次起作用,然后说不是一个函数

Angular 角度4可观测和离子3-前2次起作用,然后说不是一个函数,angular,ionic3,observable,Angular,Ionic3,Observable,我有个奇怪的问题 我有一个名为feed的页面,其中包含文件:feed.ts和feed.module.ts 在feed.ts上,我有以下功能: likeImage(image){ console.log("Right before subscribe"); this.imageMng.likeImage(image).subscribe((data) => { image.likes_image = data.status; image.numb

我有个奇怪的问题

我有一个名为feed的页面,其中包含文件:feed.ts和feed.module.ts

在feed.ts上,我有以下功能:

  likeImage(image){

    console.log("Right before subscribe");
    this.imageMng.likeImage(image).subscribe((data) => {
      image.likes_image = data.status;
      image.numberOfLikes = data.numberOfLikes;
    });
  }
正在订阅image-management.ts

   likeImage(image): Observable<any> {
    let data = new URLSearchParams();
    data.append('image_id', image.id);
    data.append('access_token', this.userMng.getToken());

    return Observable.create(observer => {
      this.http.post(this.likeLocal, data).map(res => res.json())
        .subscribe(
          data => {
            if (data.status == "restored" || data.status == "liked") {
              this.likeImage = data.status;
              observer.next({status: true, numberOfLikes: data.likes});
              //observer.complete();
            }
            if (data.status == "deleted") {
              observer.next({status: false, numberOfLikes: data.likes});
              //observer.complete();
            }
            observer.complete();
          },
          err => {
            console.log(err);
            observer.next(err);
            //observer.complete();

          }
        );

    });

  }
   likeImage(image): Observable<any> {
    let data = new URLSearchParams();
    data.append('image_id', image.id);
    data.append('access_token', this.userMng.getToken());

    return Observable.create(observer => {
      this.http.post(this.likeLocal, data).map(res => res.json())
        .subscribe(
          data => {
            if (data.status == "restored" || data.status == "liked") {
              //this.likeImage = data.status;
              observer.next({status: true, numberOfLikes: data.likes});
              //observer.complete();
            }
            if (data.status == "deleted") {
              observer.next({status: false, numberOfLikes: data.likes});
              //observer.complete();
            }
            observer.complete();
          },
          err => {
            console.log(err);
            observer.next(err);
            //observer.complete();

          }
        );

    });

  }
likeImage(图像):可观察


我做错了什么?

在使用“promises”(不在ionic上)时,在类方法内调用“this”函数时,我遇到了类似的问题

“this”始终是调用方法的对象。如果你想保留“这个”:

var that = this;
所以你可以写:

likeImage(image): Observable<any> {
    let data = new URLSearchParams();
    data.append('image_id', image.id);
    data.append('access_token', this.userMng.getToken());

    // preserve this
    let that = this;

    return Observable.create(observer => {
      that.http.post(that.likeLocal, data).map(res => res.json())
        .subscribe(
          data => {
            if (data.status == "restored" || data.status == "liked") {
              that.likeImage = data.status;
              observer.next({status: true, numberOfLikes: data.likes});
              //observer.complete();
            }
            if (data.status == "deleted") {
              observer.next({status: false, numberOfLikes: data.likes});
              //observer.complete();
            }
            observer.complete();
          },
          err => {
            console.log(err);
            observer.next(err);
            //observer.complete();

          }
        );

    });

  }
likeImage(图像):可观察{
让数据=新的URLSearchParams();
data.append('image\u id',image.id);
data.append('access_token',this.userMng.getToken());
//保存这个
让那=这;
返回可观察的。创建(观察者=>{
this.http.post(this.likeLocal,data.map)(res=>res.json())
.订阅(
数据=>{
如果(data.status==“已恢复”| | data.status==“已恢复”){
that.likeImage=data.status;
接下来({status:true,numberOfLikes:data.likes});
//observer.complete();
}
如果(data.status==“已删除”){
下一步({status:false,numberOfLikes:data.likes});
//observer.complete();
}
observer.complete();
},
错误=>{
控制台日志(err);
观察者:下一个(错误);
//observer.complete();
}
);
});
}

让我知道。

我在使用“承诺”时在类方法内调用“this”函数时遇到了类似的问题(不在ionic上)

“this”始终是调用方法的对象。如果你想保留“这个”:

var that = this;
所以你可以写:

likeImage(image): Observable<any> {
    let data = new URLSearchParams();
    data.append('image_id', image.id);
    data.append('access_token', this.userMng.getToken());

    // preserve this
    let that = this;

    return Observable.create(observer => {
      that.http.post(that.likeLocal, data).map(res => res.json())
        .subscribe(
          data => {
            if (data.status == "restored" || data.status == "liked") {
              that.likeImage = data.status;
              observer.next({status: true, numberOfLikes: data.likes});
              //observer.complete();
            }
            if (data.status == "deleted") {
              observer.next({status: false, numberOfLikes: data.likes});
              //observer.complete();
            }
            observer.complete();
          },
          err => {
            console.log(err);
            observer.next(err);
            //observer.complete();

          }
        );

    });

  }
likeImage(图像):可观察{
让数据=新的URLSearchParams();
data.append('image\u id',image.id);
data.append('access_token',this.userMng.getToken());
//保存这个
让那=这;
返回可观察的。创建(观察者=>{
this.http.post(this.likeLocal,data.map)(res=>res.json())
.订阅(
数据=>{
如果(data.status==“已恢复”| | data.status==“已恢复”){
that.likeImage=data.status;
接下来({status:true,numberOfLikes:data.likes});
//observer.complete();
}
如果(data.status==“已删除”){
下一步({status:false,numberOfLikes:data.likes});
//observer.complete();
}
observer.complete();
},
错误=>{
控制台日志(err);
观察者:下一个(错误);
//observer.complete();
}
);
});
}
让我知道。

解决了

在文件image-management.ts的函数likeImage(image:observeable)中,我有一个.likeImage=data.status,它将覆盖likeImage

修复方法:image-management.ts

   likeImage(image): Observable<any> {
    let data = new URLSearchParams();
    data.append('image_id', image.id);
    data.append('access_token', this.userMng.getToken());

    return Observable.create(observer => {
      this.http.post(this.likeLocal, data).map(res => res.json())
        .subscribe(
          data => {
            if (data.status == "restored" || data.status == "liked") {
              this.likeImage = data.status;
              observer.next({status: true, numberOfLikes: data.likes});
              //observer.complete();
            }
            if (data.status == "deleted") {
              observer.next({status: false, numberOfLikes: data.likes});
              //observer.complete();
            }
            observer.complete();
          },
          err => {
            console.log(err);
            observer.next(err);
            //observer.complete();

          }
        );

    });

  }
   likeImage(image): Observable<any> {
    let data = new URLSearchParams();
    data.append('image_id', image.id);
    data.append('access_token', this.userMng.getToken());

    return Observable.create(observer => {
      this.http.post(this.likeLocal, data).map(res => res.json())
        .subscribe(
          data => {
            if (data.status == "restored" || data.status == "liked") {
              //this.likeImage = data.status;
              observer.next({status: true, numberOfLikes: data.likes});
              //observer.complete();
            }
            if (data.status == "deleted") {
              observer.next({status: false, numberOfLikes: data.likes});
              //observer.complete();
            }
            observer.complete();
          },
          err => {
            console.log(err);
            observer.next(err);
            //observer.complete();

          }
        );

    });

  }
likeImage(图像):可观察{
让数据=新的URLSearchParams();
data.append('image\u id',image.id);
data.append('access_token',this.userMng.getToken());
返回可观察的。创建(观察者=>{
this.http.post(this.likeLocal,data.map)(res=>res.json())
.订阅(
数据=>{
如果(data.status==“已恢复”| | data.status==“已恢复”){
//this.likeImage=data.status;
接下来({status:true,numberOfLikes:data.likes});
//observer.complete();
}
如果(data.status==“已删除”){
下一步({status:false,numberOfLikes:data.likes});
//observer.complete();
}
observer.complete();
},
错误=>{
控制台日志(err);
观察者:下一个(错误);
//observer.complete();
}
);
});
}
感谢苏拉杰·拉奥

解决了

在文件image-management.ts的函数likeImage(image:observeable)中,我有一个.likeImage=data.status,它将覆盖likeImage

修复方法:image-management.ts

   likeImage(image): Observable<any> {
    let data = new URLSearchParams();
    data.append('image_id', image.id);
    data.append('access_token', this.userMng.getToken());

    return Observable.create(observer => {
      this.http.post(this.likeLocal, data).map(res => res.json())
        .subscribe(
          data => {
            if (data.status == "restored" || data.status == "liked") {
              this.likeImage = data.status;
              observer.next({status: true, numberOfLikes: data.likes});
              //observer.complete();
            }
            if (data.status == "deleted") {
              observer.next({status: false, numberOfLikes: data.likes});
              //observer.complete();
            }
            observer.complete();
          },
          err => {
            console.log(err);
            observer.next(err);
            //observer.complete();

          }
        );

    });

  }
   likeImage(image): Observable<any> {
    let data = new URLSearchParams();
    data.append('image_id', image.id);
    data.append('access_token', this.userMng.getToken());

    return Observable.create(observer => {
      this.http.post(this.likeLocal, data).map(res => res.json())
        .subscribe(
          data => {
            if (data.status == "restored" || data.status == "liked") {
              //this.likeImage = data.status;
              observer.next({status: true, numberOfLikes: data.likes});
              //observer.complete();
            }
            if (data.status == "deleted") {
              observer.next({status: false, numberOfLikes: data.likes});
              //observer.complete();
            }
            observer.complete();
          },
          err => {
            console.log(err);
            observer.next(err);
            //observer.complete();

          }
        );

    });

  }
likeImage(图像):可观察{
让数据=新的URLSearchParams();
data.append('image\u id',image.id);
data.append('access_token',this.userMng.getToken());
返回可观察的。创建(观察者=>{
this.http.post(this.likeLocal,data.map)(res=>res.json())
.订阅(
数据=>{
如果(data.status==“已恢复”| | data.status==“已恢复”){
//this.likeImage=data.status;
接下来({status:true,numberOfLikes:data.likes});
//observer.complete();
}
如果(data.status==“已删除”){
下一步({status:false,numberOfLikes:data.likes});
//observer.complete();
}
observer.complete();
},
错误=>{
控制台日志(err);
观察者:下一个(错误);
//observer.complete();
}
);
});
}

感谢苏拉杰·拉奥

不幸的是,这不起作用。我尝试了你写的东西,并且在feed.ts中有一个“let that=this”。但以上这些都不起作用。不幸的是,这不起作用。我尝试了你写的东西,并且在feed.ts中有一个“let that=this”。但是以上都不起作用。这个问题看起来像image-management.ts中的函数,你的函数
likeImage
与一个变量共享它的名称<代码>this.likeImage=data.status。因此,在某个时间点,函数会更改为status。您的IDE/linter是否会为此抛出错误?我正在使用WebStorm,这一点都没有抱怨。但你是对的,现在一切都正常了谢谢问题看起来像image-management.ts中的函数,您的函数
likeImage
与变量共享其名称<代码>this.likeImage=data.status。所以有时候