Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 26.04.2018, 16:08
Аспирант
Отправить личное сообщение для okuznetsov1 Посмотреть профиль Найти все сообщения от okuznetsov1
 
Регистрация: 02.11.2016
Сообщений: 65

Как выполнить строку содержащую код (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.

Последний раз редактировалось okuznetsov1, 27.04.2018 в 07:38.
Ответить с цитированием
  #2 (permalink)  
Старый 27.04.2018, 07:33
Аспирант
Отправить личное сообщение для okuznetsov1 Посмотреть профиль Найти все сообщения от okuznetsov1
 
Регистрация: 02.11.2016
Сообщений: 65

Пробовал через 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.

Последний раз редактировалось okuznetsov1, 27.04.2018 в 07:38.
Ответить с цитированием
  #3 (permalink)  
Старый 27.04.2018, 08:08
Аспирант
Отправить личное сообщение для okuznetsov1 Посмотреть профиль Найти все сообщения от okuznetsov1
 
Регистрация: 02.11.2016
Сообщений: 65

Сам с собой общаюсь Но не теряю надежды, что кто-то сможет помочь.

Предполагаю, что нужно копать в эту сторону:



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
Ответить с цитированием
  #4 (permalink)  
Старый 27.04.2018, 15:21
Аспирант
Отправить личное сообщение для okuznetsov1 Посмотреть профиль Найти все сообщения от okuznetsov1
 
Регистрация: 02.11.2016
Сообщений: 65

Два варианта решения, кому-то обязательно пригодится.

Вариант 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);
}
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как создать bodyclick код royksopp Общие вопросы Javascript 8 14.10.2011 16:39
Как выполнить код javascript при инклюде странички на php wfire jQuery 7 27.05.2011 14:43
Как в зависимости от результатов диалогового окна на JS выполнить PHP-скрипт? RuCosinus Общие вопросы Javascript 1 25.05.2011 10:13
Как обрезать строку и добавить символы в середине, в зависимости от длинны строки andreyua Firefox/Mozilla 12 10.12.2010 15:44
Как правильно прописать свой код в .js Всеми_Любимый Элементы интерфейса 6 23.02.2010 21:34