Вызов 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(); |
danik.js,
Спасибо за пример! Понял!) Суть в том, что бы 1 функцию разбить на несколько функций (этапов), и вызывать в нужный момент |
Разъясни свою задачу лучше.
|
danik.js,
Реализовываю общение nodejs процессов через redis sub\pub. Необходимо, что бы один процесс мог обращаться к функциям другого процесса. publish может передавать лишь строку. По этому и привязываюсь к этому |
| Часовой пояс GMT +3, время: 02:37. |