Кольцо: есть ли способ асинхронно управлять http-запросами с одного и того же IP-адреса клиента?

так что следующий запрос будет помещен в очередь и не будет обрабатываться до тех пор, пока не будет отправлен ответ предшественника?

Я пытаюсь записать в базу данных, а затем быстро разрешить пользователю запрашивать и обновлять свой последний вставленный документ.


person Benjamin McFerren    schedule 18.11.2015    source источник
comment
почему "асинхронно"? Похоже, вы хотите, чтобы они были последовательными и упорядоченными (сериализованными) из вашего описания, что отличается от асинхронного, что подразумевает отсутствие фиксированного порядка выполнения.   -  person Alex Brown    schedule 19.11.2015
comment
извинения . асинхронный в том смысле, что я не хочу, чтобы два запроса обрабатывались одновременно. id как первый http-запрос от клиента a для завершения обработки и отправки ответа клиенту a до того, как он начнет обрабатывать второй запрос от клиента a (независимо от того, какой путь URL-адреса, который клиент a попадает для первого или второго запроса)   -  person Benjamin McFerren    schedule 19.11.2015
comment
Похоже, вы пытаетесь избежать опасности чтения после записи (используя аналогию с процессором).   -  person Alex Brown    schedule 19.11.2015


Ответы (1)


Вам следует взглянуть на core.async и https://github.com/r0man/cljs-http.

Вам нужно создать канал подтверждения с помощью (chan), написать свою функцию записи в базу данных с обратным вызовом, который будет помещать >! сигнал в канал подтверждения.

(defn database-write [data db-params callback]
    ;Do stuff
    (callback status-of-the-computation))

(def confirmation-chan (chan))

;First operation
(go 
   (database-write ;data ;db-params 
         (fn [x] (>! confirmation-chan x))))

;Second operation
(go 
   (when (<! confirmation-chan) 
       (http/post "http://example.com" {:form-params {:key1 [1 2 3] :key2 "value2"}})))

Вторая операция не начнется, пока не завершится первая.

person Ricardo Acuna    schedule 19.11.2015