2013-07-04 14 views
8

Wywołanie zwrotne publikuje w PubNub API zwraca z komunikatem jak poniżej -Jak korzystać PubNub publikować zwrotnego aby dowiedzieć się, jaki komunikat ponownego publikowania w przypadku wystąpienia błędu

[1,"Sent","13729639808030640"] 

Ale to nie daje żadnych wskazówek w odniesieniu do którego wiadomość dotyczy tego wywołania zwrotnego. W przypadku błędu publikowania, pierwszą wartością w tablicy zwrotów będzie 0. Ale jak dowiedzieć się, który komunikat ponownie opublikować?

Wydawca może publikować wiadomości z wysoką częstotliwością i nie czeka na oddzwonienie przed opublikowaniem kolejnej wiadomości. Kiedy wywołanie jest wywoływane, wydawca mógł już opublikować 10 kolejnych wiadomości.

+0

Dobre pytanie i będziemy chcieli ustawić to na wiele różnych sposobów. To też zależy od używanego zestawu SDK. – PubNub

+0

Wiem, że to stare pytanie, ale nie ma na nie odpowiedzi przez @PubNub i mam taki sam dylemat jak w danym momencie. Jestem na Androidzie, ale platforma nie powinna mieć znaczenia. – klambiguit

+0

Czy możliwe jest automatyczne śledzenie pierwszego wejścia, pierwsze wyjście? @klambiguit? Odpowiedzi, błędy lub nie, nigdy nie wyjdą z rzędu. – Geremy

Odpowiedz

3

Interfejs REST API PubNub zapewnia również format JSONP. Możesz utworzyć mapę "identyfikatorów funkcji zwrotnej" do rzeczywistych komunikatów, a po zakończeniu przetwarzania możesz uzyskać odwołanie do oryginalnej wiadomości za pomocą identyfikatora "funkcji zwrotnej" z odpowiedzi.
Na przykład:

https://pubsub.pubnub.com/publish/demo/demo/0/iosdev/m_2c453/%22Hello%20world2%22 

Jak widać, istnieje m_2c453 w URI, będzie on używany przez serwer w odpowiedzi:

m_2c453([1,"Sent","14034711347326358"]) 

I tutaj wiemy, że m_2c453 został wykorzystany do wyślij wiadomość "Hello world".
Ale myślę, że zależny od platformy pakiet SDK PubNub powinien sobie z tym poradzić.

+0

Pamiętaj też, że nawet jeśli opublikowany zostanie szybki ogień, wszystkie odpowiedzi będą wracać z serwera w kolejności, w jakiej zostały wydane ... nigdy nie uzyskasz odpowiedzi na zamówienie w tym samym połączeniu, które opublikowałeś na stronie . – Geremy

+0

dziękuję za szybką odpowiedź, jak wspomniano, używam android SDK i zwraca tylko komunikat JSONArray, a nie ten z formatem jsonp. jak to zrobić w Androidzie? – klambiguit

+0

@Geremy zobacz http://stackoverflow.com/a/24357946/327428 – klambiguit

0

Przeniesione tutaj, ponieważ jest zbyt długi na odpowiedź na wiadomość.

W odpowiedzi na @Geremy, więc jeśli wiadomość 1,2,3,4,5 zostanie wysłana, otrzymam wywołanie zwrotne w zamówieniu 1,2,3,4,5? nie będzie przypadku, w którym odpowiedź zakończy się niepowodzeniem, powiedzmy 2 i 4? W takim przypadku, jeśli będziemy kontynuować twierdzenie, że otrzymujemy uporządkowaną odpowiedź, oznacza to, że odpowiedź nie dotarła do wiadomości 4 i 5 zamiast 2 i 4. Może zasugeruję zespołowi pubnub, że dodają czwarte dane w zwracanych JSONArray zawierają pole id w opublikowanej wiadomości (jeśli istnieją takie dane, np. {"id": 123, wiadomość: "cześć"}), jeśli nie ma żadnego, oczywiście Zwrócony identyfikator będzie pusty lub będzie pusty.

+1

Tak, powinieneś odzyskać odpowiedzi (dobre lub złe) w kolejności, w jakiej zostały wysłane. – Geremy

+0

W ten sposób utrzymywanie oczekującej kolejki komunikatów i likwidacji po wywołaniu wywołania zwrotnego publikowania będzie śledzić oczekujące wiadomości. – klambiguit

+1

powinieneś podkreślić to w swojej dokumentacji, ponieważ jest to bardzo ważna cecha i oczywiste. – klambiguit

0

Zmierzyłem się z podobnym wyzwaniem. Chciałem umieścić w kolejce wiadomości, gdy urządzenie jest w trybie offline, a następnie wysłać je po ponownym połączeniu. W wywołaniu zwrotnym potrzebowałem sposobu na określenie, która wiadomość została wysłana, aby usunąć ją z kolejki. Wpadłem na to rozwiązanie:

function sendData(channel, data, callback) { 
    Pubnub.publish({ 
    channel: channel, 
    message: data, 
    callback : callback 
    }); 
} 

//This code is placed within the "reconnect" callback of the subscription 
if ($localStorage.chatQueue.length) { 
    for (var i = 0; i < $localStorage.chatQueue.length; i++) { 
    sendData(
     $localStorage.chatQueue[i].channel, 
     $localStorage.chatQueue[i].data, 
     function(){ 
     console.log("arguments"); 
     console.log(arguments); 
     console.log("this"); 
     console.log(this); 
     index = $localStorage.chatQueue.indexOf(this); 
     console.log("Message in offline queue sent, index = "+index); 
     if (index > -1) { 
      $localStorage.chatQueue.splice(index, 1); 
     } 
     }.bind($localStorage.chatQueue[i]) 
    ); 
    } 
} 

Sztuką jest wiążąca this w funkcji wywołania zwrotnego do obiektu wiadomości. Wydaje się działać. Sądzę, że można również po prostu związać zmienną i, która dałaby bezpośredni wskaźnik do wiadomości w kolejce.

Zainspirował mnie to odpowiedź na inne pytanie: https://stackoverflow.com/a/19472945/3319392

Powiązane problemy