Ich habe Probleme, die Werte von core.async-Kanälen im Browser in der Reihenfolge zurückzugeben, in der sie erstellt wurden (im Gegensatz zur Reihenfolge, in der sie einen Wert zurückgeben). Die Kanäle selbst werden vom Mapping cljs-http.client/get über eine Liste von URLs zurückgegeben.Wie übertrage ich eine Liste von asynchronen Kanälen in der Reihenfolge, in der sie in einer Liste vorhanden sind?
Wenn ich die Ergebnisse manuell in einem let
Block binde, dann kann ich die Ergebnisse in der Reihenfolge der Kanäle "von Hand" zurückgeben, aber dies ist offensichtlich ein Problem, wenn ich nicht weiß, wie viele Kanäle existieren.
(let [response-channels (map #(http/get "http://date.jsontest.com" {:with-credentials? false}) (range 3))]
; Response is now three channels generated by http/get:
;(#object[cljs.core.async.impl.channels.ManyToManyChannel]
; #object[cljs.core.async.impl.channels.ManyToManyChannel]
; #object[cljs.core.async.impl.channels.ManyToManyChannel])
; If I want the results back in the guaranteed order that I made them, I can do this:
(go (let [response1 (<! (nth response-channels 0))
response2 (<! (nth response-channels 1))
response3 (<! (nth response-channels 2))]
(println "This works as expected:" response1 response2 response3))))
Aber wenn ich versuche, <!
über die Kanäle abzubilden, statt ihnen zu binden einzeln dann bekomme ich nur eine Liste von Kanälen statt ihrer Werte.
(let [response-channels (map #(http/get "http://date.jsontest.com" {:with-credentials? false}) (range 3))]
(let [responses (into [] (map (fn [c] (go (<! c))) response-channels))]
(println "This just returns the channels:" responses)
; This is still just a vec of many-to-many channels
; [#object[cljs.core.async.impl.channels.ManyToManyChannel]
; #object[cljs.core.async.impl.channels.ManyToManyChannel]
; #object[cljs.core.async.impl.channels.ManyToManyChannel]]
)
)
Ich vermute, es ist ein Problem mit dem Ort des go
Block, aber ich es nicht außerhalb der anonymen Funktion ohne Fehler bewegen kann, die ich <!
außerhalb eines go
Block bin mit.
funktioniert das nicht:
(into [] (go (map <! response-channels)))
Und ebenso wenig wie folgt aus:
(go (let [responses (into [] (map <! response-channels))]))
Ich habe auch versucht die Kanäle über async/merge
Zusammenführung und dann async/reduce
die Werte verbinden mit aber die Ergebnisse sind in der Reihenfolge, in der die Anforderungen erfüllt wurden, nicht die Reihenfolge der Kanäle, die zusammengeführt wurden.
Kann jemand etwas Licht auf das Abrufen von Werten aus einer Liste von Kanälen in der Reihenfolge der Kanäle in der Liste werfen?
Vielen Dank! Das hat den Trick gemacht. Übrigens, wissen Sie, warum doseq wo arbeitet als (go (in (map user2540914
Siehe bearbeiten (mein Bestes versucht) ... – beatngu13