如何解决用可观察的东西代替诺言
我试图了解Promises和Observables之间的区别。我已经研究过将对可观察物的承诺替换为可观察物,但是我发现的答案只是将现有的应许变为可观察物。如果我要使用现有的节点模块进行API调用,而只想使用可观察对象,是否可以这样做?如何将下面组件中的Promise逻辑转换为Observable?我想,我正在寻找有角度的最佳实践。
import { Component,OnInit,ViewChild } from '@angular/core';
import { Pokemon } from 'src/Pokemon';
import { PokeApiService } from 'src/app/poke-api.service';
import { TextFormat } from 'src/app/TextFormat';
import { Sites } from 'src/app/Sites';
import { Site } from 'src/app/Site';
import { TemplateKeywords } from 'src/app/TemplateKeywords';
import { MatTableDataSource } from '@angular/material/table';
import { MatPaginator } from '@angular/material/paginator';
import { MatSort } from '@angular/material/sort';
import { Generation } from '../Generation';
@Component({
selector: 'app-pokemon-list',templateUrl: './pokemon-list.component.html',styleUrls: ['./pokemon-list.component.css']
})
export class PokemonListComponent implements OnInit {
pokemon: Pokemon[] = [];
columnsToDisplay: string[] = ["image","number","name","evolution-link","location-link","effectiveness-link","learnset-link"];
searchText: string = '';
isLoading: boolean;
isError: boolean = false;
availableSites: Site[]; //DATA WILL GO HERE
currentGen: number = 8;
generationNumbers: number[] = Array(this.currentGen);
generations: Generation[] =
[new Generation(1,151),new Generation(2,251),new Generation(3,386),new Generation(4,493),new Generation(5,649),new Generation(6,721),new Generation(7,807),new Generation(8,893)];
pokemonDataSource: MatTableDataSource<Pokemon> = new MatTableDataSource();
@ViewChild(MatPaginator,{ static: true }) paginator: MatPaginator;
@ViewChild(MatSort,{ static: true }) sort: MatSort;
selectedSite: string = "SITE HERE"; //TODO: change this to be a parameter
selectedGenNumber: number = 8;
selectedGeneration: Generation;
constructor(private pokeApiService: PokeApiService) {
}
ngOnInit() {
this.loadPokemon();
}
loadPokemon() {
console.log("hello");
this.selectedGeneration = this.getGenerationForNumber(this.selectedGenNumber);
if (this.selectedGeneration) {
this.isLoading = true;
//PROMISE HERE
this.pokeApiService.getAllPokemon(this.selectedGeneration.pokemonCount).then((response) => {
let data = response;
console.log("this right here",data);
const pokemon = data.map(p => {
return {
name: p.name,displayName: TextFormat.ToTitleCase(p.name),number: p.number,evolutionUrls: this.buildEvolutionUrls(p.name,p.number),locationUrls: this.buildLocationUrls(p.name,effectivenessUrls: this.buildEffectivenessUrls(p.name,learnsetUrls: this.buildLearnsetUrls(p.name,p.number)
} as Pokemon;
});
this.pokemonDataSource = new MatTableDataSource(pokemon);
this.pokemonDataSource.paginator = this.paginator;
this.pokemonDataSource.sort = this.sort;
this.isLoading = false;
});
}
else {
this.isError = true;
}
}
applyFilter(event: Event) {
const filterValue = (event.target as HTMLInputElement).value;
this.pokemonDataSource.filter = filterValue.trim().toLowerCase();
if (this.pokemonDataSource.paginator) {
this.pokemonDataSource.paginator.firstPage();
}
}
getGenerationForNumber(genNumber: number) {
console.log("gen",genNumber);
return this.generations.find(g => g.id == genNumber);
}
//trimmed off some functions referenced above to keep this simpler,they're just utility functions
}
解决方法
由于这是一个有角度的项目,并且假设您使用database_services.dart
进行api调用,因此您将使用以下内容连接到import 'dart:async';
import 'package:path/path.dart';
import 'package:sqflite/sqflite.dart';
import 'counter.dart';
class DatabaseServices {
initDatabase() async {
// Open the database and store the reference.
final Future<Database> database = openDatabase(
// Set the path to the database.
join(await getDatabasesPath(),'counter_database.db'),// When the database is first created,create a table to store counters;
onCreate: (db,version) {
// Run the CREATE TABLE statement on the database.
return db.execute(
"CREATE TABLE counters(id INTEGER PRIMARY KEY,name TEXT,value INTEGER)",);
},// Set the version. This executes the onCreate function and provides a
// path to perform database upgrades and downgrades.
version: 1,);
}
// Define a function that inserts counters into the database.
Future<void> insertCounter(Counter counter) async {
// Get a reference to the database.
final Database db = await database;
// Insert the Counter into the correct table. Here,if a counter is inserted twice,// it replace any previous data.
await db.insert(
'counters',counter.toMap(),conflictAlgorithm: ConflictAlgorithm.replace,);
}
}
// A method that retrieves all the counters from the counters table.
Future<List<Counter>> counters() async {
// Get a reference to the database.
final Database db = await database;
// Query the table for all the Counters.
final List<Map<String,dynamic>> maps = await db.query('counters');
// Counvert the List<Map<String,dynamic>> into a List<Counter>
return List.generate(maps.length,(i) {
return Counter(
id: maps[i]['id'],name: maps[i]['name'],value: maps[i]['value'],);
});
}
// Method to update a Counter in the database
Future<void> updateCounter(Counter counter) async {
final db = await database;
await db.update(
'counters',where: "id = ?",whereArgs: [counter.id],);
}
//Delete a Counter from the database
Future<void> deleteCounter(int id) async {
final db = await database;
await db.delete(
'counters',whereArgs: [id],);
}
}
中的api。通常会返回HttpClient
PokeApiService
但是,由于您尚未发布Observable
服务的外观,因此代码httpClient.get(...) or httpClient.post(...)
肯定会返回PokeApiService
而不是返回this.pokeApiService.getAllPokemon(this.selectedGeneration.pokemonCount).then(...
。
如上所述,Promise
默认返回Observable
,我假设您的HttpClient
方法中有一个Observable
。
所以您现在可能有这样的东西:
toPromise()
因此,要替换它,您需要删除getAllPokemon()
,这会自动给您一个getAllPokemon() {
this.httpClient.get(....).toPromise();
}
,然后您必须将toPromise()
替换为Observable
。
或者由于某种原因,您正在使用.then()
进行api调用,那么您就必须将其替换为.subscribe()
调用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。