同步节点Js(或其他服务器端JS)调用

时间:2013-01-21 08:03:08

标签: node.js

我们正在使用Node进行开发,95%的代码是Async,工作正常。

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

我们正在寻找 1.“阻止代码直到回叫完成” 2.一次只能执行一个function1 +它的回调实例。

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

PS 2:如果没有Node任何其他Serverside JS框架?最后一个选项是使用其他lang类似python,但如果JS中的任何内容可能,我们都准备好试一试!

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分: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);
 })

答案 2 :(得分: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或某些并发库中那样)。