Return 来自 angular 方法的异步数据
Return asynchronous data from an angular method
我是 angular 的新手,我仍在尝试以 angular + httpClient + rxjs 的方式做事。我正在尝试编写等同于以下内容的 rxjs:
async onButtonClick = () => {
const processedBooks = await this.getAndProcessBooks();
await myGenericHttpClient.post('/api/something', processedBooks);
}
async getAndProcessBooks = () => {
const books = await myGenericHttpClient.get('/api/books');
const processedBooks = books.map(book => {
return book.read = true;
});
return books;
};
我对 rxjs 的理解是我需要使用 angular 的 httpClient 发出请求然后订阅响应:
getAndProcessBooks = () => {
return httpClient.get('/api/books').subscribe(books => {
return books;
});
};
但是,问题是 getAndProcessBooks
return 是订阅,而不是书籍数组,所以我不确定此方法如何 return 我需要的数据。任何帮助或资源指导将不胜感激!
您可以直接使用 observable 并直接使用它。
unprocessedBooks$: Observable<any>;
getAndProcessBooks() {
unprocessedBooks$ = httpClient.get('/api/books').pipe(data => {return data;});
};
并且在html
<div>{{ unprocessedBooks$ | async}}</div>
您可以使用 mergeMap、concatMap 等不同的地图运算符从一个 API 调用中获取结果并将其发送到另一个 API 调用RxJs 等,适合您的用例。
为了便于阅读,我分离了您的 HTTP 调用并为它们创建了函数。
//Returns Books
getAndProcessBooks(): Observable<any> {
return this.myGenericHttpClient.get('/api/books');
}
//API something that requires books to send call
apiSomethingFunction(processedBooks: any): Observable<any> {
return this.myGenericHttpClient.post('/api/something', processedBooks);
}
//On the button click
onButtonClick(): void {
this.getAndProcessBooks()
.pipe(
switchMap((books) => {
//Response of books comes here, you can map them before sending it to the something API
return this.apiSomethingFunction(books);
})
)
.subscribe((resp) => {
console.log(resp);
console.log('I got Response of API Something');
});
}
我使用 switchMap
运算符的原因是如果用户再次单击该按钮,则取消之前的 HTTP 调用。如果您的 use-case 不同,您可以使用不同的地图。
我是 angular 的新手,我仍在尝试以 angular + httpClient + rxjs 的方式做事。我正在尝试编写等同于以下内容的 rxjs:
async onButtonClick = () => {
const processedBooks = await this.getAndProcessBooks();
await myGenericHttpClient.post('/api/something', processedBooks);
}
async getAndProcessBooks = () => {
const books = await myGenericHttpClient.get('/api/books');
const processedBooks = books.map(book => {
return book.read = true;
});
return books;
};
我对 rxjs 的理解是我需要使用 angular 的 httpClient 发出请求然后订阅响应:
getAndProcessBooks = () => {
return httpClient.get('/api/books').subscribe(books => {
return books;
});
};
但是,问题是 getAndProcessBooks
return 是订阅,而不是书籍数组,所以我不确定此方法如何 return 我需要的数据。任何帮助或资源指导将不胜感激!
您可以直接使用 observable 并直接使用它。
unprocessedBooks$: Observable<any>;
getAndProcessBooks() {
unprocessedBooks$ = httpClient.get('/api/books').pipe(data => {return data;});
};
并且在html
<div>{{ unprocessedBooks$ | async}}</div>
您可以使用 mergeMap、concatMap 等不同的地图运算符从一个 API 调用中获取结果并将其发送到另一个 API 调用RxJs 等,适合您的用例。
为了便于阅读,我分离了您的 HTTP 调用并为它们创建了函数。
//Returns Books
getAndProcessBooks(): Observable<any> {
return this.myGenericHttpClient.get('/api/books');
}
//API something that requires books to send call
apiSomethingFunction(processedBooks: any): Observable<any> {
return this.myGenericHttpClient.post('/api/something', processedBooks);
}
//On the button click
onButtonClick(): void {
this.getAndProcessBooks()
.pipe(
switchMap((books) => {
//Response of books comes here, you can map them before sending it to the something API
return this.apiSomethingFunction(books);
})
)
.subscribe((resp) => {
console.log(resp);
console.log('I got Response of API Something');
});
}
我使用 switchMap
运算符的原因是如果用户再次单击该按钮,则取消之前的 HTTP 调用。如果您的 use-case 不同,您可以使用不同的地图。