简体   繁体   中英

How can I solve - Property 'then' does not exist on type 'Subscription'

I wrote PUT and DELETE methods inside their functions ("editForm" and "deleteForm" respectively).

I wanted to display setAlert() function after each request successfully completes. therefore, I used .then() method and it works perfectly inside editForm function as you can see it below.

but when I do the same for deleteForm , .then() method does not works, because it says: " Property 'then' does not exist on type 'Subscription' ". So how can I solve this?

Here is my component.ts file:

import { Component, OnInit, OnDestroy } from '@angular/core';
import { ActivatedRoute, Router } from '@angular/router';
import { FormService } from './forms.service';
import { HttpClient } from '@angular/common/http';
import { alert } from './alert';

@Component({
  selector: 'app-forms',
  templateUrl: './forms.component.html',
  styleUrls: ['./forms.component.css']
})


export class FormsComponent implements OnInit {

  alert: alert;
  id: any;
  posts: any;

  constructor(public formService: FormService ,private route: ActivatedRoute,
    private router: Router, private http: HttpClient) { }



  ngOnInit() {
    this.id=this.route.snapshot.params['id'];
    this.alert = new alert();

    this.posts = this.formService.getForms(this.id).subscribe(
      (forms: any) => {
        this.formService.form = forms[0];
      }
    );
  }

  editPost() {
    this.formService.editForm().then((res:any) => {
      this.formService.alert.setAlert("Post has been successfully saved !");
    })
  }

  deletePost() {
    this.formService.deleteForm().subscribe(
      data  => {
        console.log("DELETE Request is successful ", data);
      },
      error  => {
        console.log("Error", error);
      }
    ).then(() => {
      this.formService.alert.setAlert("Post has been successfully deleted !");
    })
  }

}

Here is my service.ts file:

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { form } from './form-interface';
import { alert } from './alert';


@Injectable({
    providedIn: 'root'
}) 

export class FormService {

  formsUrl = "https://jsonplaceholder.typicode.com/posts";
  form: form = {
      id: 0,
      userId: 0,
      title: '',
      body: ''
  };
  alert: alert;


    constructor(private http: HttpClient) { 
      this.alert = new alert();
    }

    getForms(id) {
            return this.http.get('https://jsonplaceholder.typicode.com/posts'
            + "?id=" + id)
    }

    editForm() {
        return fetch(this.formsUrl + "/" + this.form.id, {
          method: 'PUT',
          body: JSON.stringify(this.form),
          headers: {
            "Content-type": "application/json; charset=UTF-8"
          }
        })
        .then(response => response.json())
    }

    deleteForm() {
        return this.http.delete(this.formsUrl + "/" + this.form.id);
      }

}

because http returns observable not promise. Use .subscribe here.It will solve your problem

The editform method uses JavaScript fetch api to call the service, which returns the promise so then method works there. In deleteForm method, you are making a service call using angular HttpClient which returns observable. instead of using then you should use subscribe method

deleteForm() {
        return this.http.delete(this.formsUrl + "/" + this.form.id);
}

In your component.ts

 deletePost() {
    this.formService.deleteForm().subscribe(
      data  => {
        console.log("DELETE Request is successful ", data);
        this.formService.alert.setAlert("Post has been successfully deleted !");
      },
      error  => {
        console.log("Error", error);
      }
    )
  }

You can use message when you get a proper response while you get the response in subscribe method and call alert into it Like below

deletePost() {
this.formService.deleteForm().subscribe(
  data  => {
    console.log("DELETE Request is successful ", data);
    this.formService.alert.setAlert("Post has been successfully deleted !");
  },
  error  => {
    console.log("Error", error);
  }
))

}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM