Angular 如何发出POST请求以按角度4/5顺序保存对象列表
我如何在角度为4/5的情况下处理以下问题 例如,我有一个由parentId关联的对象列表Angular 如何发出POST请求以按角度4/5顺序保存对象列表,angular,web-services,observable,Angular,Web Services,Observable,我如何在角度为4/5的情况下处理以下问题 例如,我有一个由parentId关联的对象列表 [ { id: 10, name: "Parent Unit", parentId: null, }, { id: 11, name: "Unit Child 1", parentId: 10, }, { id: 12, name: "Unit Child 2", parentId: 10, }
[
{
id: 10,
name: "Parent Unit",
parentId: null,
},
{
id: 11,
name: "Unit Child 1",
parentId: 10,
},
{
id: 12,
name: "Unit Child 2",
parentId: 10,
}
]
我需要通过web服务调用POST方法三次来保存它们。要求是我必须同步保存它们。我的意思是,我必须等到父单元被保存,web服务返回它的新id,然后我可以为单元子1向web服务发出另一个带有修改的parentId的POST请求,并为单元子2发出带有修改的parentId的类似请求
我在angular应用程序中使用Observable来创建web服务。你知道我该怎么做吗 你的意思可能是: 第一个问题是您的数据结构并不真正适合这个用例。我认为最好是有层次结构,而不是扁平结构。但如果它必须保留,那么我会像这样实现它。如果重构数据结构,那么保存的代码可能会更好
// pseudo code
save() {
// first request
let promise = httpService.post('someurl', parentObject)
.then(() => {
// second request for children
return httpService.post('someurl', childObject);
})
.catch((err) => {
// handle error
});
}
将它们链接起来:
假设您使用Angular的HttpClient:
然后,通过订阅结果,您可以知道三个操作何时完成或是否有错误。当然,在每个平面图中,您也可以使用结果、服务器的响应或忽略它
现在,如果您想要链接N个调用的方法,可以定义如下函数:
chainPost(request: Observable<any>, url: string, item: any): Observable<any> {
return request ? request.flatMap(() => http.post(url, item))
: http.post(url, item);
}
现在,您可以订阅可观察的请求,并等待它完成或抛出错误
当然,在这里,我对服务发送和返回的数据都使用了any,因为我不知道您是否有自定义类型或接口,但是,不管怎样,您都可以更改它们以满足您的需要。谢谢您的回答。我按照你的建议为层次结构创建了一个新问题,作为更好的方法,谢谢你的回答。我正在考虑reduce方法是否应该具有init属性。在您的示例中,它没有,并且我认为前面的参数成为请求数组的第一项,它不是可观察的类型。我说的对吗?reduce中的前一个参数具有上一次迭代返回的值。在本例中,我没有初始化它,因为在第一次调用中未定义它,chainPost只返回第一个请求。当然,我假设您发布的只是数组。如果您已经有一个正在进行的请求,您可以将返回的observable传递给reduce,来自数组的请求将被链接。
chainPost(request: Observable<any>, url: string, item: any): Observable<any> {
return request ? request.flatMap(() => http.post(url, item))
: http.post(url, item);
}
const requests: any[] = [{...},{...}, ...]; // any number of items
const request = requests.reduce((previous, item) => chainPost(previous, url, item));