angular2 承诺 observables 和 DI
angular2 promises observables and 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.
您必须return您搜索方法中的承诺:
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);
}
)
}
}
这样您就可以在调用此方法的组件中调用 then:
search(term) {
this.myService.search(term).then(items => this.items = items);
}
对于任何在这里找到路的人来说,只有几件事。我为方法添加了一个类型
search(oSrchParams): any { ...}
电话变成了
this._searchCall.search(oSrchParams).then(
(item) => (
this._ngZone.run(()=>{
this.items = result,
(console.log("search", JSON.stringify(this.items)))
})
)
);
ngZone 像服务一样注入到构造函数中,并确保对 this.items
的更改反映在浏览器中。我可能有太多 (),但它有效:-)
如果我有这样的服务
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.
您必须return您搜索方法中的承诺:
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);
}
)
}
}
这样您就可以在调用此方法的组件中调用 then:
search(term) {
this.myService.search(term).then(items => this.items = items);
}
对于任何在这里找到路的人来说,只有几件事。我为方法添加了一个类型
search(oSrchParams): any { ...}
电话变成了
this._searchCall.search(oSrchParams).then(
(item) => (
this._ngZone.run(()=>{
this.items = result,
(console.log("search", JSON.stringify(this.items)))
})
)
);
ngZone 像服务一样注入到构造函数中,并确保对 this.items
的更改反映在浏览器中。我可能有太多 (),但它有效:-)