Nativescript, как использовать этот JavaLain EventListener в Javascript? - PullRequest
0 голосов
/ 01 октября 2019

Я использую NativeScript и реализовал библиотеку Pusher-Java в качестве зависимости, я могу успешно подключиться и подписаться на мой канал Pusher, но у меня есть надежное добавление SubscriptionEventListener в мой канал,

Вот мой код, который подключается к пушеру с помощью библиотеки Java в Nativescript:

module.exports = {
    connect:function(app_key, channel_name, event_name) {
        PusherOptions = com.pusher.client.PusherOptions;
        Pusher = com.pusher.client.Pusher;
        Channel = com.pusher.client.channel.Channel;
        SubscriptionEventListener = com.pusher.client.channel.SubscriptionEventListener;
        PusherEvent = com.pusher.client.channel.PusherEvent;

        var options = new PusherOptions().setCluster("eu");
        var pusher = new Pusher(app_key, options);

        pusher.connect();

        var channel = new Channel(pusher.subscribe(channel_name));
    }
};

А вот код Java для привязки SubscriptionEventListener к каналу:

channel.bind("my-event", new SubscriptionEventListener() {
    @Override
    public void onEvent(PusherEvent event) {
        System.out.println("Received event with data: " + event.toString());
    }
});

Теперь, как я могу связать это, используя Javascript !? Я пробовал все, что мог придумать, но все еще не мог привязать SubscriptionEventListener к каналу с Javascript,

спасибо

ОБНОВЛЕНИЕ

Я использую этот метод, который, как ожидается, будет работать, а также @Manoj ответил здесь:

channel.bind(event_name,
    new SubscriptionEventListener({
        onEvent: function(event) {
            console.log(event.toString());
        }
    })
);

Но он не работает, и я получаю эту ошибку:

java.lang.RuntimeException: Unable to start activity ComponentInfo{org.nativescript.plugintestproject/com.tns.NativeScriptActivity}: com.tns.NativeScriptException: Calling js method onCreate failed
System.err: Error: Building UI from XML. @app-root.xml:1:1
System.err:  > java.lang.AbstractMethodError: abstract method "void com.pusher.client.channel.Channel.bind(java.lang.String, com.pusher.client.channel.SubscriptionEventListener)"
System.err:       com.tns.Runtime.callJSMethodNative(Native Method)


Ответы [ 3 ]

1 голос
/ 01 октября 2019

Пара вещей:

  1. Почему бы просто не использовать плагин nativescript-pusher? Он уже существует ...

  2. Второй, если вы не хотите его использовать;почему бы не позаимствовать код, как он есть под лицензией Apache 2.0.


Однако, чтобы конкретно ответить на ваш вопрос:

const sel = new com.pusher.client.channel.SubscriptionEventListener( {
            onEvent: function(channel, event, data) {
                 console.log("Channel:", channel, "Event", event, "received event with data: " + data.toString());
            }
          } );

Во-первых, вы действительноследует использовать пространство имен FULL при создании события (это делает очевидным, что создается).
Во-вторых, ваш прототип для onEvent был неверным. Согласно документации, это Channel, Event, Data параметры, передаваемые в него.

0 голосов
/ 03 октября 2019

благодаря Натанаэлю Вот окончательный код:

module.exports = {
    connect:function(app_key, channel_name, event_name) {
        PusherOptions = com.pusher.client.PusherOptions;
        Pusher = com.pusher.client.Pusher;
        Channel = com.pusher.client.channel.Channel;
        PusherEvent = com.pusher.client.channel.PusherEvent;
        SubscriptionEventListener = com.pusher.client.channel.SubscriptionEventListener;
        ChannelEventListener = com.pusher.client.channel.ChannelEventListener;

        const options = new PusherOptions().setCluster("eu");
        const pusher = new Pusher(app_key, options);

        pusher.connect();

        const channel = new Channel(pusher.subscribe(channel_name));
        const connectedChannel = pusher.getChannel(channel_name);

        let sel = new SubscriptionEventListener({
            onEvent: function(event) {
                console.log(event);
            }
        });

        connectedChannel.bind(event_name, sel);
    }
};

0 голосов
/ 01 октября 2019

SubscriptionEventListener - это интерфейс, вы должны реализовать методы и передать экземпляр в метод привязки, как показано в документах .

channel.bind("my-event", 
   new SubscriptionEventListener({
    onEvent: function(event) {
        console.log("Received event with data: " + event.toString());
    }
   })
);
...