Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 如何发出POST请求以按角度4/5顺序保存对象列表_Angular_Web Services_Observable - Fatal编程技术网

Angular 如何发出POST请求以按角度4/5顺序保存对象列表

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, }

我如何在角度为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,  
  } 
]
我需要通过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));