Вызов callback из JSON
Всем привет!)
Хочется поинтересоваться, возможно ли передать аргумент callback в виде json строки, а потом парсить полученную на вход строку и вызвать callback? То есть, есть функции, которые могут общаться между собой исключительно строками, а не объектами. Нужны идеи, как можно вызвать callback, если передать можно только строку? Заранее спасибо!) |
вот те строка и парсь ее
str = '{"a": 1, "b": 2}'; console.log(JSON.parse(str)); |
skrudjmakdak, Мне необходимо не просто парсить строку, мне необходимо из этой запарсенной строки вызвать callback.
test2 = function (callback) { callback = JSON.parse(callback); callback('hello'); } test2(JSON.stringify(function (res) { console.log(res); })); В идеале должно выдать "hello" в консоль =( |
var func = 'function(text){alert(text)}'; new Function('return ' + func + '.apply(null, arguments)')('Hello'); Вот так? |
Ruslan_xDD,
Спасибо большое, да! Не подскажете, можно ли функцию преобразовать в строку? |
рассмотрим ваш пример:
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); }); |
skrudjmakdak,
Спасибо за подсказку! Но дело в том, что мне каким то образом необходимо передать именно функцию в виде строки, из-за невозможности передать в функцию не строку. Ruslan_xDD уже показал, как это можно сделать. Теперь вопрос в том, как можно преобразовать передаваемую функцию в строку |
console.log((function () {}).toString()) |
Обычно делают так:
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')); Т.е. функция напрямую не вызывается. Вместо этого мы просто просим вызвать ее (указывая ее имя), и передаем для нее агрумент. Что-то подобное я в расширении для хрома использовал. Так как там общение идет через строковые сообщения. |
Разобрался, спасибо!
Функцию можно преобразовать в строку с помощью function.toString(); |
Часовой пояс GMT +3, время: 11:00. |