Передача функции обратного вызова в виде строки при сохранении цепочки областей видимости - PullRequest
0 голосов
/ 28 июня 2011

Для приложения iPad, использующего UIWebView, я передаю функцию обратного вызова приложению по URL-адресу:

function query(db, query, callback) {
  var iframe = document.createElement("IFRAME");

  // Filter comments from the callback (as this would break things).
  var callbackstr = "" + callback;
  callbackstr = callbackstr.replace(/\/\*.+?\*\/|\/\/.*(?=[\n\r])/g, ''); 

  // Put the query + the callback in an url that will be caught by the iOS app. 
  iframe.setAttribute("src", "ios-query:#iOS#" + query +":#iOS#"+ callbackstr);
  document.documentElement.appendChild(iframe);
  iframe.parentNode.removeChild(iframe);
  iframe = null;    
}

Приложение анализирует функцию обратного вызова из URL-адреса и вызывает функцию обратного вызова с помощьюнекоторые данные вставлены через stringByEvaluatingJavaScriptFromString.Это все работает нормально.

Однако теперь я хочу использовать замыкание в функции обратного вызова, например так:

            var callback = function (problemdata) {
                // Return the 'real' callback.
                return function (tx, results) {
                    // Do something with problemdata
                }
            }(problemdataFromScopeChain)

Это проблематично.Поскольку функция обратного вызова преобразуется в строку, вся информация о цепочке областей действия теряется.

Есть предложения о том, как решить эту проблему?

edit:

Я бы предпочелрешение на стороне функции «запрос».Например: есть ли способ преобразовать переменные в цепочке областей видимости в строку, способную к вычислению eval ()?

Ответы [ 2 ]

3 голосов
/ 28 июня 2011

Вместо того, чтобы передавать саму функцию обратного вызова на страницу запроса, не могли бы вы передать идентификатор, который сопоставляется с индексом в массиве обратных вызовов?

, например

var callback = function(problemdata){
// Do stuff
};

callbacks = [];
callbacks.append(callback); // so index of 0

Сейчасвы предоставляете запрос iframe src с индексом обратного вызова вместо фактической функции обратного вызова

наконец, ваш скрипт на стороне сервера запросов может вернуть что-то вроде

callbacks[0]("this is a load of JSON for example");
0 голосов
/ 28 июня 2011
var problemdataFromScopeChain = 4;
var callback = function(problemdata){
  // Return the 'real' callback.
  //return function (tx, results) {
  //  // Do something with problemdata
  //  return tx + results + problemdata;
  //}
  return new Function('tx', 'results', 'return tx + results + ' + problemdata + ';');
}(problemdataFromScopeChain);
alert('' + callback);

Но, на мой взгляд, использование такого конструктора функций не очень приятно =).https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function

...