2016-08-05 3 views
0

Я хочу получить комментарии от моего API. Итак, функция должна обещать возвращение? Что лучше? Clasic или обещание вернуться?Angular2: Promise return

И у меня все еще есть проблема, возврат обещания не определен.

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} 
]; 

И я получаю в консоли этих:

valoare

Array [Object]

неопределенными

+0

Вопрос, действительно ли лучше вернуть обещание или простое значение? Вы используете обещание только в том случае, если вам нужно сделать асинхронный вызов (где вы не можете вернуть простое значение), в противном случае выполнение синхронизации всегда будет предпочтительным, за исключением случаев, когда вы явно хотите выполнить что-то async по любой причине. –

+0

Я видел на Угловом сайте этот пример .. Я просто спросил, вы знаете, почему не работает? Мне понравилось на угловом сайте. –

+0

На угловом сайте они имитируют асинхронный вызов для демонстрационных целей о том, как справиться с асинхронным выполнением. Это не означает, что это предпочтительнее. –

ответ

1

Вам нужно переместить код внутри then(...) (то же самое для наблюдаемых с subscribe(...)

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

Целью Promise и then(...) является включение цепочки вызовов, чтобы последующий вызов выполнялся по завершении предыдущего.

Выполнение асинхронного вызова означает, что вызов завершен в очередь событий и код синхронизации (ваш console.log()) выполняется следующим образом. Код, переданный в .then(...), в конце концов выполняется, когда Promise решает (обычно, когда приходит ответ от сервера).

Смежные вопросы