Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Вызов callback из JSON (https://javascript.ru/forum/misc/51757-vyzov-callback-iz-json.html)

Dorian_bs 18.11.2014 16:25

Вызов callback из JSON
 
Всем привет!)
Хочется поинтересоваться, возможно ли передать аргумент callback в виде json строки, а потом парсить полученную на вход строку и вызвать callback?

То есть, есть функции, которые могут общаться между собой исключительно строками, а не объектами. Нужны идеи, как можно вызвать callback, если передать можно только строку?

Заранее спасибо!)

skrudjmakdak 18.11.2014 16:33

вот те строка и парсь ее
str = '{"a": 1, "b": 2}';
console.log(JSON.parse(str));

Dorian_bs 18.11.2014 16:37

skrudjmakdak, Мне необходимо не просто парсить строку, мне необходимо из этой запарсенной строки вызвать callback.

test2 = function (callback) {
    callback = JSON.parse(callback);
    callback('hello');
}

test2(JSON.stringify(function (res) {
     console.log(res);
}));


В идеале должно выдать "hello" в консоль =(

ruslan_mart 18.11.2014 16:41

var func = 'function(text){alert(text)}';

new Function('return ' + func + '.apply(null, arguments)')('Hello');


Вот так?

Dorian_bs 18.11.2014 16:47

Ruslan_xDD,
Спасибо большое, да!
Не подскажете, можно ли функцию преобразовать в строку?

skrudjmakdak 18.11.2014 16:48

рассмотрим ваш пример:

test2(JSON.stringify(function (res) {
     console.log(res);
}));

в метод stringify надо передавать объект, а вы передаете функцию, это никуда не годится (в данном случае пустой объект):
JSON.stringify({})


вот. передавайте 2 параметра. один строка, другой функция:
function test (str, fn) {
	fn(JSON.parse(str));
}

test('{"a": 1, "b": 2}', function (obj) { console.log(obj); });

Dorian_bs 18.11.2014 16:50

skrudjmakdak,
Спасибо за подсказку! Но дело в том, что мне каким то образом необходимо передать именно функцию в виде строки, из-за невозможности передать в функцию не строку. Ruslan_xDD уже показал, как это можно сделать.

Теперь вопрос в том, как можно преобразовать передаваемую функцию в строку

skrudjmakdak 18.11.2014 16:55

console.log((function () {}).toString())

danik.js 18.11.2014 16:56

Обычно делают так:

var a = function (data) {
    data = JSON.parse(data);
    var commands = {
        log: function(data) {
            console.log(data);
        },
        alert: function(data) {
             alert(data);
        }
    };
    commands[data.command](data.arg);
};

var b = function(data) {
    data = JSON.parse(data);
    var str = data.charAt(0).toUpperCase() + data.substring(1);
    a(JSON.stringify({command: 'alert', arg: str}));
};
 
b(JSON.stringify('hello'));



Т.е. функция напрямую не вызывается. Вместо этого мы просто просим вызвать ее (указывая ее имя), и передаем для нее агрумент.

Что-то подобное я в расширении для хрома использовал. Так как там общение идет через строковые сообщения.

Dorian_bs 18.11.2014 16:56

Разобрался, спасибо!
Функцию можно преобразовать в строку с помощью
function.toString();


Часовой пояс GMT +3, время: 11:00.