Вам не нужно использовать setTimeout для симуляции асинхронных операций (если только вам не нужна поддержка старых браузеров). В этом случае достаточно просто добавить async
перед функцией:
async addComponent(componentClass: ComponentFactory<any>, target) {
let componentRef: ComponentRef<any> = this.container.createComponent(componentClass);
target.appendChild(window.document.getElementById(componentRef.instance.index));
}
Вы указываете, что setTimeout предназначен для решения проблемы DOM. Есть некоторые ошибки браузера, которые должны быть обработаны таким образом, но я проверю, чтобы убедиться, что это не связано с состоянием гонки или асинхронной c проблемой, которую вы должны исправить напрямую.
Вы можете обернуть setTimeout в Обещание, чтобы вы могли его дождаться.
addComponent(componentClass: ComponentFactory<any>, target) {
let componentRef: ComponentRef<any> = this.container.createComponent(componentClass);
return new Promise((res,rej) => {
setTimeout(() => {
target.appendChild(window.document.getElementById(componentRef.instance.index));
res();
}, 0);
});
}
Обратите внимание, что функция внутри подписки выполнена async
. Теперь вы можете поставить await
перед вызовом addComponent, чтобы он дождался окончания операции до sh, прежде чем продолжить.
ngOnInit() {
this.route.queryParamMap.subscribe((paramMap: ParamMap) => {
var id = paramMap.get('id');
if (id) {
console.log(id)
this.savestate.getcomponents(id).subscribe(
async (data) => {
for (var i = 0; i < data['data'].length; i++) {
if (data['data'][i].selector === 'app-col') {
var colcomponent = new Col(this.factoryResolver)
if (data['storetargetid'][i] === "content") {
await this.dragDropService.addComponent(colcomponent.component,document.getElementById("content"))
}
else {
var arr =data['storetargetid'][i].split("-",2)
await this.dragDropService.addComponent(colcomponent.component,document.getElementById(arr[0]).children[0].children[arr[1]])
}
}
}