Event "before" a asynchroniczność

Event "before" a asynchroniczność
EB
  • Rejestracja:ponad 6 lat
  • Ostatnio:około 4 lata
  • Postów:51
0

Mam taki kod:

Kopiuj
manager.attachEvent("onBeforeDelete", function(id){

  var item = manager.getItem(id);
         
      $.ajax({
           type: 'DELETE',
           url: url,
           data: { id: id }
       }).done(function (data) {
               // true
       }).fail(function(xhr) {
              // false
       });
});

Jest to podpięcie się pod event w momencie kliknięcia usuń w takim sobie menadżerze. Zwracając true lub false sterujemy, czy ten element zniknie po stronie frontu (brak return jest równy zwrotce true). Moje pytanie czy da się to osiągnąć za pomocą promises, bo w tym momencie skrypt oczywiście nie czeka na zwrotkę z serwera, tylko element znika bez względu czy udało się usunąć czy nie.

edytowany 3x, ostatnio: eBizo
Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:prawie 2 lata
  • Lokalizacja:Wrocław
  • Postów:13042
1

Once you go async, you never go back - nie można zamienić kodu asynchronicznego na synchroniczny, stąd odpowiedź: nie, nie można tego osiągnąć w sposób, w jaki myślisz.

Może mógłbyś zrobić return $.ajax({ ... }) i przerobić kod odpowiedzialny za chowanie elementów tak, aby sprawdzał czy nie otrzymywał Promise i wtedy podpinał się automatycznie pod .then()?


EB
  • Rejestracja:ponad 6 lat
  • Ostatnio:około 4 lata
  • Postów:51
0

No właśnie tak myślałem, że jeżeli twórca biblioteki nie przewidział w zwrotce promise, to nic nie jestem w stanie zrobić.
No właśnie nie mam wpływu na bibliotekę, choć to dość potężny framework (webix) więc może przewidzieli taki case.
https://docs.webix.com/api__refs__promise.html

edytowany 1x, ostatnio: eBizo
kult
  • Rejestracja:prawie 22 lata
  • Ostatnio:ponad rok
0
EB
Na który rozdział wskazujesz bo ta podstrona jest dosyć długa? A o samego ajaxa chyba nie chodzi bo nie widzę różnicy czy korzystam z ich metod, czy jQuery.
kult
Chodzi mi o sync mode. Masz blokujący ajax, który możesz wykorzystać w swojej funkcji. W stylu return webix.ajax().sync().delete(url, { id }) != undefined;
EB
Tylko jeżeli to jest to samo co ustawienie async w jQuery to słabe, bo faktycznie wtedy działa, ale wiadomo, że się tego nie używa.
kult
Tak i nie. Może wyżej wszystko siedzi w promisie? Nie znam tej biblioteki webix więc trudno mi powiedzieć. Zaproponowałem rozwiązanie do twojego konkretnego problemu, ale zdaję sobie sprawę, że należy szukać innego rozwiązania. Prawdopodobnie zacząłbym od szukania w dokumentacji czegoś w rodzaju Event Handling.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.