Передача функции обратного вызова js в качестве параметра в Java addJavascriptInterface - PullRequest
2 голосов
/ 26 декабря 2011

Возможно ли, чтобы произвольные функциональные объекты в js передавались на сторону Java, поэтому java может вызывать этот объект js?(обратный вызов)

например, (доступ - это функция, которая уже зарегистрирована для вызова функции Java)

access(function(blabla){
    ...
});

Существуют ли какие-либо замечательные методы, которые могут иметь дело с функцией анонимного обратного вызова в Java

1 Ответ

3 голосов
/ 15 ноября 2016

Вам просто нужен какой-то ключ для ссылки на вашу индивидуальную анонимную функцию обратного вызова.Я думаю, именно так иногда используется jsonp.

Javascript:

var callbacks = [];
function registerCallback(callback)
{
   callbacks.push(callback);
   return callbacks.length - 1;
}

function getCallback(index)
{
   var callback = callbacks[index];
   callbacks[index] = null;

   TryGCCallbacks();

   return callbacks;
}

//The array index positions must be preserved, but when it's empty, we should restart the array so it doesn't grow forever
function TryGCCallbacks()
{
   var isCallbackRemaining = false;
   for (var i = 0; i < callbacks.length; i++)
   {
      if (callbacks[i] == null) {
         continue;
      }

      isCallbackRemaining = true;
      break;
   }
   if (isCallbackRemaining == false)
   {
      callbacks = []; //reset
   }
}

Java:

@org.xwalk.core.JavascriptInterface
public String TestCallback(String someData, String onSuccess, String onError){
   xwalk.evaluateJavascript("getCallback(" + onSuccess + ")('success');", null);
}

Использование этого из Javascript:

var onSuccess = registerCallback(function(r) {
   console.log(r);
});

TestCallback('lalala', onSuccess, null);
...