Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何使用core.async代替回调?_Node.js_Callback_Clojurescript_Core.async - Fatal编程技术网

Node.js 如何使用core.async代替回调?

Node.js 如何使用core.async代替回调?,node.js,callback,clojurescript,core.async,Node.js,Callback,Clojurescript,Core.async,我在ClojureScript上使用core.async来避免使用node.js回调。问题是我达到了1024条待处理消息的限制 为了避免这种情况,我需要将所有消息发送到同一go块内的频道。但这在core.async上是不可能的,因为匿名函数会使go的效果无效,所以我不能这样做: (开始 (.“数据”上的套接字(>!chan%)) 那么,有没有办法绕过这个限制呢 我不太明白为什么它必须在同一个围棋区。通常,您只需执行以下操作: (“数据”上的.socket(go(put!chan%)) 然后在

我在ClojureScript上使用core.async来避免使用node.js回调。问题是我达到了1024条待处理消息的限制

为了避免这种情况,我需要将所有消息发送到同一
go
块内的频道。但这在core.async上是不可能的,因为匿名函数会使
go
的效果无效,所以我不能这样做:

(开始
(.“数据”上的套接字(>!chan%))

那么,有没有办法绕过这个限制呢

我不太明白为什么它必须在同一个围棋区。通常,您只需执行以下操作:

(“数据”上的.socket(go(put!chan%))

然后在另一个go块中处理chan来模拟错误,我们可以“模拟”一种回调:

(let [callback (atom nil)
      on-data (fn [fun]
                (reset! callback fun))
      chan (async/chan)]
如果我们尝试添加一个带有
(关于数据#(async/go(async/put!chan%))
的回调,它将超出限制。此外,当我们使用
async/go
时,它会导致通道内的消息出现故障

我发现解决这个问题的唯一方法是在
atom
中创建一个无限的
promise chan
列表,每个回调都会拾取第一个元素,发布一条消息,并删除列表中的第一个元素。然后,我们可以在将为我们发布消息的
go
块中有一个
doseq

(let [inf-list (atom (map (fn [_] (async/promise-chan)) (range)))]
  ; We need to iterate over inf-list before anything
  (let [lst @inf-list]
    (async/go
     (doseq [c lst]
       (async/>! chan (async/<! c)))))

  (on-data #(do
              (async/put! (first @inf-list) %)
              (swap! inf-list rest))))
(让[inf列表(原子(映射(异步/承诺更改))(范围))]
;在进行任何操作之前,我们需要迭代inf列表
(让[lst@inf列表]
(异步/去
(doseq[c lst]

(async/>!chan(async/当错误
AssertionError Assert失败时,这会失败:不允许超过1024个挂起的put
事实上,上面的代码不会抛出异常,因为它位于
go
块内。但是如果您将
put!
环绕
(尝试…(catch Throwable t…)
您将看到错误我刚刚添加了一个适当的语言提示。当同时使用clojurescript和node.js或javascript进行标记时,请使用该提示确保语法highlighter正常工作。