2016-08-05 24 views
0

Ich möchte die Kommentare von meiner API erhalten. Also sollte die Funktion eine Rückkehr versprechen? Was ist besser? Clasic oder Versprechen zurück?Angular2: Versprechen zurück

Und ich habe immer noch ein Problem, das Versprechen Rückkehr zurück undefined.

comments.component.ts

import { Component, OnInit } from '@angular/core'; 
import { CommentService } from '../services/comment.service'; 
import { Comment } from '../class/Comment'; 

@Component({ 
    template: 'dadada', 
    providers: [CommentService] 
}) 

export class CommentsComponent implements OnInit { 
    coms: Comment[]; 

    constructor(private commentService: CommentService) { 
    } 

    ngOnInit() { 
     console.log(this.commentService.testfunction()); 

     this.commentService.get_all_comments().then((data) => { 
      this.coms = data; 
      }); 
     console.log (this.commentService.get_all_comments2()); 
     console.log (this.coms); 
    } 
} 

comment.service.ts

import { Injectable } from '@angular/core'; 
import { Comment, Comments } from '../class/Comment'; 

@Injectable() 
export class CommentService { 
    testfunction() { 
     return 'valoare'; 
    } 
    get_all_comments() { 
     return Promise.resolve(Comments); 
    } 
    get_all_comments2() { 
     return Comments; 
    }  
} 

Comment.ts

export class Comment { 
    id: number; 
    text: string; 
    author: string; 
    created_at: number; 
    updated_at: number; 
} 

export const Comments: Comment[] = [ 
    {id: 1, text: 'Look I am a test comment.', author: 'Chris Sevilleja', created_at: 0, updated_at: 0} 
]; 

Und ich bekomme in der Konsole diese:

valoare

Array [Objekt]

undefined

+0

Ist die Frage wirklich, ob es besser ist, ein Versprechen oder einen einfachen Wert zurückzugeben? Sie verwenden eine Zusage nur dann, wenn Sie einen asynchronen Aufruf durchführen müssen (wobei Sie keinen einfachen Wert zurückgeben können), andernfalls wird die Ausführung der Synchronisation immer bevorzugt, außer wenn Sie aus irgendeinem Grund explizit async ausführen möchten. –

+0

Ich habe auf Angular Website dieses Beispiel .. Ich habe nur gefragt, wissen Sie, warum nicht funktioniert? Ich mochte auf angular site .. –

+0

Auf der Angular-Site simulieren sie einen Async-Aufruf zu Demonstrationszwecken über die Async-Ausführung. Dies bedeutet nicht, dass es bevorzugt wird. –

Antwort

1

benötigen Sie den Code innerhalb des then(...) (gleich für Observablen mit subscribe(...)

bewegen
ngOnInit() { 
    console.log(this.commentService.testfunction()); 

    this.commentService.get_all_comments().then((data) => { 
     this.coms = data; 
     console.log (this.commentService.get_all_comments2()); 
     console.log (this.coms); 
     }); 
} 

Der Zweck von Promise und then(...) besteht darin, Aufrufe zu ketten, so dass ein nachfolgender Aufruf ausgeführt wird, wenn der vorherige abgeschlossen ist.

Async-Ausführung bedeutet, dass der Anruf in die Ereigniswarteschlange eingereiht wird und der Synchronisierungscode (console.log()) als nächstes ausgeführt wird. Der Code, der an .then(...) übergeben wird, wird schließlich ausgeführt, wenn die Promise aufgelöst wird (normalerweise, wenn die Antwort vom Server eintrifft).