2011-02-10 15 views
6

Czy istnieje sposób użycia RequestFactory do utworzenia dwóch elementów w jednym żądaniu? Próbowałem:GWT RequestFactory i wiele żądań

EmployeeRequest request = requestFactory.employeeRequest(); 
    EmployeeProxy newEmployee = request.create(EmployeeProxy.class); 
    newEmployee.setName("Joe!"); 

    Request<Void> createReq = request.persist().using(newEmployee); 
    createReq.fire(); 

    EmployeeProxy newEmployee2 = request.create(EmployeeProxy.class); 
    newEmployee2.setName("Sam!"); 

    Request<Void> createReq2 = request.persist().using(newEmployee2); 
    createReq2.fire(); 

Ale pojawia się błąd, że żądanie jest już w toku. Po dwóch osobnych żądaniach dotyczących pracowników:

EmployeeRequest request = requestFactory.employeeRequest(); 
    EmployeeProxy newEmployee = request.create(EmployeeProxy.class); 
    newEmployee.setName("Joe!"); 

    Request<Void> createReq = request.persist().using(newEmployee); 
    createReq.fire(); 

    EmployeeRequest request2 = requestFactory.employeeRequest(); 
    EmployeeProxy newEmployee2 = request2.create(EmployeeProxy.class); 
    newEmployee2.setName("Sam!"); 

    Request<Void> createReq2 = request2.persist().using(newEmployee2); 
    createReq2.fire(); 

Następnie z przeglądarki są wysyłane dwa oddzielne zapytania. Mam nadzieję, że coś w RequestFactory może łączyć wiele żądań - muszę tworzyć setki podmiotów naraz i nie chcę wysyłać setek próśb!

Odpowiedz

9

Tak, jest to możliwe. W pierwszym przykładzie, po prostu usunąć wiersz

createReq.fire(); 

Po wywołaniu createReq2.fire() na końcu, a następnie GWT wysyła zarówno newEmployee i newEmployee2 w jednym wniosku (bo oboje byli utrzymywały się w kontekście swojej EmployeeRequest „request”). Osobiście uważam, że semantyka jest trochę dziwna, ale to tylko moja opinia.

Uzupełnienie przez Riley: następującą składnię odpowiada i jest o wiele bardziej intuicyjny:

EmployeeRequest request = requestFactory.employeeRequest(); 
    EmployeeProxy newEmployee = request.create(EmployeeProxy.class); 
    newEmployee.setName("Joe!"); 

    request.persist().using(newEmployee); 

    EmployeeProxy newEmployee2 = request.create(EmployeeProxy.class); 
    newEmployee2.setName("Sam!"); 

    request.persist().using(newEmployee2); 
    request.fire(); 
+0

Och, jak dziwne. Bardzo dziwne. Czy to znaczy, że muszę stworzyć jakiś mechanizm, aby zaplanować wywołanie fire() po wykonaniu wszystkich wywołań persist(), które chcę wykonać? Sądzę, że byłoby to dość proste w przypadku odroczonego polecenia, ale ... coś niezręcznego! –

+0

@Riley: Zawinąłbym cały kod, który buduje żądanie w metodzie lub we własnym obiekcie. Użyłbym jakiejś zmiennej (lub pola) do zapamiętania ostatniego żądania. Następnie po wykonaniu tej części kodu, nazwałbym fire na najnowszej prośbie. (Nie użyłbym polecenia odroczonego - jest zbyt roztrzęsiony, ponieważ nie jest łatwo upewnić się, kiedy dokładnie zostanie wykonany). –

+0

Aktualizacja: Robiłem głupi błąd i teraz twój kod działa świetnie. Zastanowię się nad sposobami agregowania żądań. Dzięki Chris! –