Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 18.11.2014, 16:25
Профессор
Отправить личное сообщение для Dorian_bs Посмотреть профиль Найти все сообщения от Dorian_bs
 
Регистрация: 24.03.2011
Сообщений: 217

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

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

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

Последний раз редактировалось Dorian_bs, 18.11.2014 в 16:27.
Ответить с цитированием
  #2 (permalink)  
Старый 18.11.2014, 16:33
Профессор
Отправить личное сообщение для skrudjmakdak Посмотреть профиль Найти все сообщения от skrudjmakdak
 
Регистрация: 27.04.2012
Сообщений: 1,410

вот те строка и парсь ее
str = '{"a": 1, "b": 2}';
console.log(JSON.parse(str));
Ответить с цитированием
  #3 (permalink)  
Старый 18.11.2014, 16:37
Профессор
Отправить личное сообщение для Dorian_bs Посмотреть профиль Найти все сообщения от Dorian_bs
 
Регистрация: 24.03.2011
Сообщений: 217

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

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

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


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

Последний раз редактировалось Dorian_bs, 18.11.2014 в 16:42.
Ответить с цитированием
  #4 (permalink)  
Старый 18.11.2014, 16:41
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 3,018

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

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


Вот так?

Последний раз редактировалось ruslan_mart, 18.11.2014 в 16:44.
Ответить с цитированием
  #5 (permalink)  
Старый 18.11.2014, 16:47
Профессор
Отправить личное сообщение для Dorian_bs Посмотреть профиль Найти все сообщения от Dorian_bs
 
Регистрация: 24.03.2011
Сообщений: 217

Ruslan_xDD,
Спасибо большое, да!
Не подскажете, можно ли функцию преобразовать в строку?
Ответить с цитированием
  #6 (permalink)  
Старый 18.11.2014, 16:48
Профессор
Отправить личное сообщение для skrudjmakdak Посмотреть профиль Найти все сообщения от skrudjmakdak
 
Регистрация: 27.04.2012
Сообщений: 1,410

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

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); });
Ответить с цитированием
  #7 (permalink)  
Старый 18.11.2014, 16:50
Профессор
Отправить личное сообщение для Dorian_bs Посмотреть профиль Найти все сообщения от Dorian_bs
 
Регистрация: 24.03.2011
Сообщений: 217

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

Теперь вопрос в том, как можно преобразовать передаваемую функцию в строку
Ответить с цитированием
  #8 (permalink)  
Старый 18.11.2014, 16:55
Профессор
Отправить личное сообщение для skrudjmakdak Посмотреть профиль Найти все сообщения от skrudjmakdak
 
Регистрация: 27.04.2012
Сообщений: 1,410

console.log((function () {}).toString())
Ответить с цитированием
  #9 (permalink)  
Старый 18.11.2014, 16:56
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

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

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'));



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

Что-то подобное я в расширении для хрома использовал. Так как там общение идет через строковые сообщения.
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #10 (permalink)  
Старый 18.11.2014, 16:56
Профессор
Отправить личное сообщение для Dorian_bs Посмотреть профиль Найти все сообщения от Dorian_bs
 
Регистрация: 24.03.2011
Сообщений: 217

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

Последний раз редактировалось Dorian_bs, 18.11.2014 в 17:00.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с textarea Rompo Events/DOM/Window 14 16.12.2013 17:41
Не могу распарсить JSON. gorenie jQuery 3 29.11.2013 22:26
Ajax и Json callback функция borabora Prototype & script.aculo.us 0 30.01.2012 15:01
JSON или JSONP для запросов на другой сервер? Метод GET, для длинных сообщений? Kotakota jQuery 5 23.08.2011 23:12
JSON. Как в callback функции изменить свойство объекта? master_alf jQuery 10 22.04.2010 17:08