angular2承诺观测和DI

问题描述:

如果我有一个看起来像这样angular2承诺观测和DI

import {Injectable} from 'angular2/core'; 

@Injectable() 
export class MyService { 

    search(oSrchParams){ 

    let promise =() => 
    new Promise((resolve, reject) => 
     Meteor.call('mockSearchWS', (error:any, result:any) => error ? reject(error) : resolve(result)) 
    ); 

    promise().then(
     (result:Array<Object>) => { 
     return result 
     }, 
     (error) => { 
     console.log('failed', error); 
     } 
    ) 
    } 
} 

我怎样才能把它,并得到一个值,当它被注射服务?像这样:

import {Component} from 'angular2/core'; 
import {MyService} from './my-service'; 
import 'rxjs/add/operator/map'; 
import 'rxjs/add/operator/toPromise'; 

@Component ({ 
    selector: 'search', 
    providers:[MyService] 
}) 

export class App { 
    items: Array<string>; 
    constructor(private myService: MyService) { 
} 

search(term) { 
    // this.myService.search(term).then(items => this.items = items); 
    // this.myService.search(term).subscribe() 
    } 
} 

我不确定服务是否是可观察的。我见过的大多数例子都使用http。

+0

如果你想让它像'return promise()那样返回承诺,那么(' –

+0

是否使用Mongo? –

你必须在你的搜索方法返回的承诺:

search(oSrchParams){ 

    let promise =() => 
    new Promise((resolve, reject) => 
     Meteor.call('mockSearchWS', (error:any, result:any) => error ? reject(error) : resolve(result)) 
    ); 

    return promise().then(
     (result:Array<Object>) => { 
     return result 
     }, 
     (error) => { 
     console.log('failed', error); 
     } 
    ) 
    } 
} 

这样你就可以再调用在调用此方法的组件:

search(term) { 
    this.myService.search(term).then(items => this.items = items); 
} 
+0

感谢您的解决方案!好的,我打算在这里放一些代码,但是这没有多行......呃 – shotleybuilder

只是一个任何人在这里找到他们的方式的情侣。我包括为方法

search(oSrchParams): any { ...} 

A型和通话成为

this._searchCall.search(oSrchParams).then(
    (item) => (
    this._ngZone.run(()=>{ 
     this.items = result, 
     (console.log("search", JSON.stringify(this.items))) 
    }) 
) 
); 

ngZone注入喜欢该服务的构造函数,并确保到this.items变化被反映在浏览器中。我可能有太多的(),但它的工作原理:-)