You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular 4 Observable与Ionic 3点赞功能前两次正常,第三次报错

问题根源:类方法被意外覆盖了

嘿,我一眼就揪出问题所在了!你遇到的第三次点击报错“不是函数”,核心原因是你在image-management.ts的likeImage方法里,把类的同名方法给覆盖成字符串了!

看这段出问题的代码:

if (data.status == "restored" || data.status == "liked") {
  this.likeImage = data.status; // 这里就是罪魁祸首!
  observer.next({status: true, numberOfLikes: data.likes});
  observer.complete();
}

this.likeImage本来是你定义的类方法,结果你在这里把它赋值成了data.status(一个字符串,比如"liked"或者"restored")。第一次和第二次调用时,方法还没被覆盖,所以能正常执行;但第二次调用完成后,this.likeImage已经变成字符串了,第三次点击调用的时候,自然就会报错“不是函数”。

修复方案

第一步:改掉覆盖方法的错误代码

把那行覆盖方法的代码删掉,或者换一个类属性来存储状态。比如先在类里定义一个专门的状态属性:

// 在image-management类顶部添加属性
currentLikeStatus: string;

// 然后修改likeImage方法里的对应代码
if (data.status == "restored" || data.status == "liked") {
  this.currentLikeStatus = data.status; // 用新属性存储状态,不再覆盖方法
  observer.next({status: true, numberOfLikes: data.likes});
  observer.complete();
}

第二步:优化Observable写法(可选但推荐)

你不需要手动创建Observable,直接返回this.http.post的Observable即可,手动创建不仅冗余还容易出错。优化后的likeImage方法可以写成这样:

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

  return this.http.post(this.likeLocal, data).pipe(
    map(res => res.json()),
    map(data => {
      if (data.status == "restored" || data.status == "liked") {
        this.currentLikeStatus = data.status;
        return {status: true, numberOfLikes: data.likes};
      }
      if (data.status == "deleted") {
        return {status: false, numberOfLikes: data.likes};
      }
      throw new Error('Unknown status received');
    }),
    catchError(err => {
      console.log(err);
      return throwError(() => err);
    })
  );
}

这样代码更简洁,也避免了手动管理Observable订阅和complete的潜在问题。

内容的提问来源于stack exchange,提问作者Pzoco

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:55:41