2015-08-13 7 views
2

Начиная с этих двух обработчиков, которые заботятся о получении текущей информации о пользователе:Как заставить обработчики запускаться последовательно в повторном кадре?

(re-frame/register-handler 
    :got-user 
    (fn [db [_ user]] 
    (assoc db :user user))) 

(re-frame/register-handler 
    :get-user 
    (fn [db [_]] 
    (ajax/GET "/user" 
     {:handler #(re-frame/dispatch [:got-user %1])}) 
    db)) 

на одной странице, я хочу, чтобы отобразить список друзей, но проблема заключается в том, что это зависит от того, пользователь является неправдоподобным первым :

(re-frame/register-handler 
    :get-friends 
    (fn [db [_]] 
    (when (nil? (:user db)) 
     (re-frame/dispatch [:get-user])) 
    ; Here's the problem, as I need to way for get-users and got-users to run. 
    (ajax/GET (str "https://stackoverflow.com/users/" (get-in db [:user :id])) 
     {:handler #(re-frame/dispatch [:got-friends %1])}) 
    db)) 

Как я должен структурировать этот код?

+0

Я только что узнал о повторной кадре, но вот идея: почему бы не отправить '[: get-user {: next: get-user-friends}]' с каким-то стилем продолжения прохождения, где ': next' - это событие для отправки, когда мы получили пользователя? обработчик для ': got-user' отправил следующее событие. Поэтому ': get-friends' разделяется на две части:': get-friends' (при необходимости получите пользователя) и ': get-user-friends' (получить друзей для известного пользователя). – coredump

+0

@coredump да, я играл с этим, но продолжения трудно поддерживать и отлаживать, и передача ключевого слова-как-продолжение неизбежно будет недостаточной в будущем по моему скромному мнению. – Pablo

+0

Я не понимаю, почему было бы трудно поддерживать и отлаживать. Мне кажется, что вы уже используете подход, управляемый событиями, с обратными вызовами (обработчиками). События обмена IMHO прекрасно сочетаются с существующей структурой. Если я правильно понимаю, вы можете передать произвольные аргументы обработчикам для ваших будущих потребностей, а не только ключевые слова. Приветствия. – coredump

ответ

0

Принимая вдохновение из article about solving the CPU hog problem Я СДЕЛАЛ Get-Никнейм себя в то время как пользователь ноль, но, чтобы избежать отправки много запросов на сервер, он также добавляет флаг о пользователь запрашиваемых:

(re-frame/register-handler 
    :get-friends 
    (fn [db [_ user-requested]] 
    (if-let [user (:user db)] 
     (ajax/GET (str "https://stackoverflow.com/users/" (get-in db [:user :id])) 
       {:handler #(re-frame/dispatch [:got-friends %1])}) 
     (do 
     (when (not user-requested) 
      (re-frame/dispatch [:get-user])) 
     (re-frame/dispatch [:get-friends true]))) 
    db)) 

It работает, но на локальной машине ему удается называть себя 9 раз или около того, пока пользователь не установит пользователя. Не уверен, что это будет проблемой или нет, и я открыт для других решений, если они существуют.

1

First, the documentation specifically warns against creating handlers with side-effects (т. Е. Отправка событий от обработчиков событий). Во-вторых, не пытайтесь повторно использовать обработчики событий, но реорганизуйте повторно используемые части в вспомогательные функции. Используя re-frame-http-fx, я бы написать что-то вроде этого:

(reg-event-fx 
    :get-friends 
    [trim-v] 
    (fn 
    [{db :db} [_]] 
    {:http-xhrio (if (:user db) 
        {:method   :get 
        :uri    (str "https://stackoverflow.com/users/" (get-in db [:user :id])) 
        :on-success  [:got-friends] 
        :on-failure  [:get-friends-load-failed]} 

        {:method   :get 
        :uri    "/user" 
        :on-success  [:get-friends-for-user] 
        :on-failure  [:get-friends-user-load-failed]}) 
    :db   db} 
    )) 

: Get-друзей-для-пользователя будет затем первым сохранить найденную пользователя и начать выборку друзей.

+0

Я понимаю, что я только два года опаздываю, отвечая на ваш вопрос :), но поскольку у него, похоже, не было хорошего решения, я думал, что мой ответ может помочь другим, которые в конечном итоге видят ваш вопрос. – Kalle