2016-09-07 5 views
0

Как я могу передать сервис на обещание? Я пытаюсь создать обещание, которое решит, когда все http-запросы вернутся. Прямо сейчас this.jiraService не определено. Есть ли все-таки передать его конструктору обещания?Угловая 2/typescipt pass service to prom

Спасибо!

export class JiraComponent { 
private stories:Map<string,number> = new Map<string,number>(); 

constructor(private jiraService:JiraService) { 
} 

ngOnInit() { 
    this.jiraService.search() 
     .then(x => this.getKeys(x['issues'])) 
     .then(keys => this.getLogs(keys)) 
     .then(x => console.log(this.stories)); 
} 

getKeys(issues:Array<Object>) { 
    let keys = new Array<string>(); 
    for (var i of issues) { 
     keys.push(i['key']); 
    } 
    return keys; 
} 

getLogs(keys:Array<string>) { 
    return new Promise(function (resolve, reject) { 
     let count = 0; 
     for (var k of keys) { 
      this.jiraService.worklog(keys[0]).then(x => { 
       count++; 
       console.log(x); 
       if (!this.stories.get(k)) { 
        this.stories.set(k, x['timeSpentSeconds']); 
       } 
       else { 
        this.stories.set(k, this.stories.get(k) + x['timeSpentSeconds']); 
       } 
       if (count == keys.length) { 
        resolve(); 
       } 
      }); 
     } 
    }); 
} 
+0

См http://stackoverflow.com/a/20279485/294949 – danh

ответ

1

Если у вас возникли проблемы с доступом к this объекта в функции исполнителя вашего Promise, this explanation может помочь вам (как упоминалось выше, Дань).

Однако это не каноническая структура для приложения Angular 2, и это может быть источником некоторых из ваших проблем. Хорошим местом для начала является официальное обсуждение Angular 2 Style Guide «Компоненты и услуги» (все это стоит прочитать, хотя!).

Услуга делает обещание

Как правило, компонент не должен делать никаких обещаний на всех. Служба предоставляет ваши компоненты (конечные точки) для доступа к бизнес-логике и/или службам данных (базы данных, внешние API и т. Д.).

import { Injectable } from '@angular/core'; 

@Injectable() 
export class MyService { 
    private allIsGood: boolean; 

    public doSomething(): Promise<any> { 
     console.log("I promise to return at some point."); 
     return new Promise(function (resolve, reject) { 
      this.allIsGood = someLongRunningActivity(); 
      if (this.allIsGood) { 
       console.log("Resolving the promise."); 
       resolve(); 
      } else { 
       console.log("Something bad happened, don't forget to check for errors!"); 
       reject(); 
      } 
     }); 
    } 

    private someLongRunningActivity(): boolean { 
     //run a query or perform some calculation 
     return true; 
    } 
} 

компоненты получают обещания

Компоненты должны вызывать службу и потреблять это возвращается обещание.

import { Component } from '@angular/core'; 
import { MyService } from '../services'; 

@Component({ 
    selector: 'my-selector', 
    templateUrl: 'my template.html' 
}) 
export class MyComponent { 

    constructor(private myService: MyService) { 
     this.myService.doSomething() 
      .then(() => { 
       console.log("The promise was honored, you can do what you were waiting to do."); 
      }) 
      .catch(() => { 
       console.log("You remembered to check for errors!"); 
      }); 
    }); 
} 

Несколько предостережений:

  • Это предполагает, что вы настроили ваши Поставщик правильно во время начального процесса начальной загрузки!
  • Пути к вашим импорта может варьироваться ...

Я только разрешается размещать две ссылки, поэтому я не могу предоставить какие-либо более хорошие ссылки. Читайте на обещаниях и наблюдениях на сайте документации Angular 2 сверху. Надеюсь это поможет!