gpt4 book ai didi

javascript - Angular - 从 Promise 同步获取

转载 作者:行者123 更新时间:2023-11-28 17:53:41 28 4
gpt4 key购买 nike

我想打印产品的历史记录。我在 ActivatedRoute.params 中有一个产品 ID。在 ngOnInit 方法中,我必须获取产品的所有历史记录并分配给变量。然后我想将产品映射到productHistory,因为我想将最后一个版本与历史记录放在一起。但问题在于获取历史记录。获取历史记录的方法返回 Promise,当我使用此属性并且未定义时,我无法获取 productsHistory 的长度。从服务加载后如何获得此属性?

我想在执行 getHistory() 后执行方法。

我的代码:

产品服务.ts:

import { Injectable } from '@angular/core';
import { Headers, Http } from '@angular/http';

import 'rxjs/add/operator/toPromise';

// rest imports

@Injectable()
export class ProductService {

// URL to web api
private projectsUrl = 'http://localhost:8080/products';

private headers = new Headers({'Content-Type': 'application/json'});

constructor(private http: Http) {}

getHistory(id: number): Promise<ProductHistory[]> {
const url = `${this.projectsUrl}/projectId/${id}`;
return this.http.get(url)
.toPromise()
.then(response => response.json() as ProductHistory[])
.catch(this.handleError);
}

handleError() {
//...
// implementation is irrelevant
}
}

ProductHistoryComponent.ts:

import { Component, Input, OnInit } from '@angular/core';
import { ActivatedRoute, Params } from '@angular/router';
import { Location } from '@angular/common';

import { ProductService } from './product.service';

import { ProductHistory } from './product-history';
import { Product } from './model/product';

import 'rxjs/add/operator/switchMap';

@Component({
selector: 'product-history',
templateUrl: './product-history.component.html',
styleUrls: [ './product-history.component.css' ]
})
export class ProductHistoryComponent implements OnInit {

auditProducts: ProductHistory[] = new Array<ProductHistory[]>();
selectedProduct: ProductHistory;

constructor(
private route: ActivatedRoute,
private location: Location,
private productService: ProductService
) {}

ngOnInit(): void {
let id: number = this.route.snapshot.params['id'];

this.productService.getHistory(id)
.then(history => this.historyProducts = history);

this.productService.getProduct(id)
.then(product => {
let lastVersion: ProductHistory = this.createLastVersion(product);
this.auditProducts.push(lastVersion);
});
}

onSelect(ProductHistory: ProductHistory): void {
this.selectedProduct = ProductHistory;
this.compare(this.selectedProduct);
}

goBack(): void {
this.location.back();
}

compare(history: ProductHistory): void {
let previous: ProductHistory;
if (history.changeNumber != null && history.changeNumber > 1) {
previous = this.historyProducts[history.changeNumber - 2];
if (typeof previous != 'undefined') {
this.setPreviousDiffsFalse(previous);
if (previous.name !== history.name) {
history.nameDiff = true;
}
if (previous.price !== history.price) {
history.priceDiff = true;
}
}
}
}

createLastVersion(product: Product): ProductHistory {
let lastVersionProduct: ProductHistory = new ProductHistory();
lastVersionProduct.id = this.historyProducts.length + 1;
lastVersionProduct.name = product.name;
lastVersionProduct.price = product.price;
lastVersionProduct.changeNumber = this.historyProducts[this.historyProducts.length - 1].changeNumber + 1;
return lastVersionProduct;
}

setPreviousDiffsFalse(previous: ProductHistory): void {
previous.nameDiff = false;
previous.priceDiff = false;
}

}

最佳答案

您无法同步运行它,您必须等待每个 Promise 返回结果,然后才能对该结果执行某些操作。执行此操作的正常方法是在使用 Promise 时将代码嵌套在 then block 中。或者,您也可以将 async/await 与最新版本的 typescript 一起使用,并且只需更改您的 component 代码,因为您已经返回了 Promise 从您的服务中输入。这使得代码更容易阅读(IMO),尽管发出的 javascript 代码仍将使用函数/回调嵌套(除非您的目标是 es7,我相信,也许有人会纠正或确认这一点)。

// note the use of async and await which gives the appearance of synchronous execution
async ngOnInit() {
let id: number = this.route.snapshot.params['id'];

const history = await this.productService.getHistory(id);
this.historyProducts = history;

const product = await this.productService.getProduct(id);
let lastVersion: ProductHistory = this.createLastVersion(product);
this.auditProducts.push(lastVersion);
}

关于javascript - Angular - 从 Promise 同步获取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44929517/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com