0

我们使用 Node 进行开发,95% 的代码是异步的,运行良好。

对于大约 5%(一个小模块),本质上是同步的 [并且依赖于其他第三方软件],

我们正在寻找 1.“在回调完成之前阻塞的代码” 2. 一次只应该执行一个 function1 的实例 + 它的回调。

PS 1:我完全同意,Node 用于异步工作,我们应该避免这种情况,但这是单独的非实时过程。

PS 2:如果不使用 Node 任何其他服务器端 JS 框架?最后一个选择是使用其他语言,如 python,但如果 JS 有任何可能,我们准备试一试!

4

3 回答 3

0

SEQ应该可以解决您的问题。

有关同步模块的概述,请查看http://nodejsrocks.blogspot.de/2012/05/how-to-avoid-nodejs-spaghetti-code-with.html

Seq()
 .seq(function () {
   mysql.query("select * from foo",[], function(err,rows,fields) {

        this(null, rows);
   });
 })
 .seq(function(mysqlResult) {
     console.log("mysql callback returnes:"+mysqlResult);
 })
于 2013-01-21T09:52:24.277 回答
0

有很多很多的选项,看看node-asynckaffeine异步支持、IcedCoffeescript等。

于 2013-01-21T08:07:37.207 回答
0

我想为IcedCoffeeScript做一个插件,因为我是它的维护者。您可以使用 Seq 之类的解决方案,但通常您会使用函数调用对控制流进行编码。我发现这种方法很难编写和维护。IcedCoffeeScript 使简单的顺序操作变得轻而易举:

console.log "hello, just wait a sec"
await setTimeout defer(), 100
console.log "ok, what did you want"

但更重要的是,它处理异步代码和标准控制流的任意组合:

console.log "Let me check..."
if isRunningLate()
  console.log "Can't stop now, sorry!"
else
  await setTimeout defer(), 1000
  console.log "happy to wait, now what did you want?"
resumeWhatIWasDoingBefore()

循环也很好用,这里是串行调度:

for i in [0...10]
   await launchRpc defer res[i]
done()

这是并行调度:

await
   for i in [0...10]
      launchRpc defer res[i]
done()

ICS 不仅使异步代码的顺序链更流畅,还鼓励您尽可能多地并行执行。如果您需要更改您的代码或您的并发要求,更改是最小的,而不是完全重写(就像在标准 JS/CS 或一些并发库中那样)。

于 2013-04-25T23:52:08.453 回答