Как выполнить строку содержащую код (angular 4 + typescript + redux)?
Имеется строковая переменная template, в которую периодически приходит код такого плана, при этом данная переменная находится в epic-e:
private createTranslateChangedEpic() { template = 'concat( of(new SummaryActivitySitesActions().setPage('4c3ef357', {page: 1})).delay(100), of(new SummaryActivitySitesActions().setPage('6d8540f0', {page: 1})).delay(100) )'; return <template>; В общем нужно каким-то образом трансформировать строку "template" в код который выполниться и будет возвращаться значение из epic-a. |
Пробовал через eval (пока сойдёт, потом нужно будет переделать без eval), но получаю ошибку "ERROR ReferenceError: concat is not defined".
template = 'let e = concat( of(new SummaryActivitySitesActions().setPage('4c3ef357', {page: 1})).delay(100), of(new SummaryActivitySitesActions().setPage('6d8540f0', {page: 1})).delay(100) )'; eval(template); Кстати of() - оборачивание в observable (import {of} from 'rxjs/observable/of'), скорее всего проблема будет такая же как с concat. |
Сам с собой общаюсь:) Но не теряю надежды, что кто-то сможет помочь.
Предполагаю, что нужно копать в эту сторону: const result = `"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var concat_1 = require("rxjs/observable/concat"); var e = concat_1.concat(of(new SummaryActivitySitesActions().setPage('e26fd5f3', { page: 1 })).delay(100), of(new SummaryActivitySitesActions().setPage('5e4f6aaf', { page: 2 })).delay(100)); `; eval(result); Появилась ошибка: ERROR ReferenceError: exports is not defined |
Два варианта решения, кому-то обязательно пригодится.
Вариант 1 import * as ts from 'typescript'; import {of} from 'rxjs/observable/of'; import {concat} from 'rxjs/observable/concat'; private createTranslateChangedEpic() { const g = Groups.getSelectedGroupForSelectedPerspective(storeState); const reportId1 = storeState.groups[0].id; const reportId2 = storeState.groups[1].id; const code = `({ Run: (concat: <T>, of: <T>, actions: SummaryActivitySitesActions, reportId1, reportId2) => { console.log('run'); return concat( of(actions.setPage(reportId1, {page: 1})).delay(100), of(actions.setPage(reportId2, {page: 1})).delay(100) ); } })`; const result = ts.transpile(code); const runnalbe = eval(result); return runnalbe.Run(concat, of, this.actions, reportId1, reportId2); } Вариант 2 private createTranslateChangedEpic() { const g = Groups.getSelectedGroupForSelectedPerspective(storeState); const reportId1 = storeState.groups[0].id; const reportId2 = storeState.groups[1].id; const f = new Function( 'concat', 'of', 'actions', 'reportId1', 'reportId2', `return function (concat, of, actions, reportId1, reportId2) { console.log('run'); return concat( of(actions.setPage(reportId1, {page: 1})).delay(100), of(actions.setPage(reportId2, {page: 1})).delay(100) ); }` )(concat, of, this.actions, reportId1, reportId2); return f(concat, of, this.actions, reportId1, reportId2); } |
Часовой пояс GMT +3, время: 04:11. |