我正在嘗試在共享點串列中執行元資料更新。在組件中,我有:
this.datasetService.updateMetadata(oldDatasetName, projectMetadata).subscribe(() => {
this.onCompleted('DownloadDataset.Updated');
}, error => this.onError(error, 'DownloadDataset.UpdateError'));
然后在服務中:
updateMetadata(oldDatasetName: string, metadata: ProjectDatasetModel): Observable<boolean[]> {
const filterString = `DataSetName eq '${oldDatasetName}'`;
return this.graphService.getFilteredListItems(ResourceNames.PROJECT_DATASET_LIST_NAME, filterString).pipe(switchMap(items => from(items).pipe(mergeMap(item => {
const updated = { ...item, DataSetName: metadata.datasetName, DataSetDescription: metadata.datasetDescription };
return this.graphService.updateListItem(ResourceNames.PROJECT_DATASET_LIST_NAME, updated.Id, updated);
}), toArray(), tap(() => console.log("Update completed")))));
}
圖服務:
public getFilteredListItems(listTitle: string, filter: string): Observable<any[]> {
const sub$ = new Subject<any[]>();
this.configureSharepointToken().subscribe(configured => {
sp.web.lists.getByTitle(listTitle).items.filter(filter).get().then((items: any[]) => {
sub$.next(items);
});
});
return sub$.asObservable();
}
public updateListItem(listTitle: string, itemId: number, listItem: any): Observable<boolean> {
const sub$ = new Subject<boolean>();
this.configureSharepointToken().subscribe(configured => {
sp.web.lists.getByTitle(listTitle).items.getById(itemId).update(listItem)
.then(iar => {
sub$.next(true);
});
});
return sub$.asObservable();
}
我的問題是,如果有要更新的專案,更新確實會發生并且我可以使用新的元資料,但 tap() 永遠不會發生。有什么建議?
uj5u.com熱心網友回復:
在getFilteredListItems和updateListItem 中,您將回傳一個永遠不會完成的主題。該指定者運營商將不會執行,直到受試者被關閉。
創建和回傳主題的整個程序是多余的。如果configureSharepointToken回傳一個 observable,那么只需從這些流中切換映射。超級有趣的事實:由于get方法回傳承諾,因此它們可以在任何接受 observable 的運算子中作業。
public getFilteredListItems(listTitle: string, filter: string): Observable<any[]> {
return this.configureSharepointToken().pipe(
switchMap(() => sp.web.lists.getByTitle(listTitle).items.filter(filter).get())
);
}
public updateListItem(listTitle: string, itemId: number, listItem: any): Observable<boolean> {
return this.configureSharepointToken().pipe(
switchMap(() => sp.web.lists.getByTitle(listTitle).items.getById(itemId).update(listItem)),
mapTo(true)
);
}
注意,如果configureSharePointToken保持打開狀態,可能需要在管道的開頭添加第一個運算子。就個人而言,它會發出不止一次的光似乎很奇怪。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/403697.html
標籤:
