我们正在使用Node进行开发,95%的代码是Async,工作正常。
对于大约5%(一个小模块),它本质上是同步的[并且取决于其他第三方软件],
我们正在寻找 1.“阻止代码直到回叫完成” 2.一次只能执行一个function1 +它的回调实例。
PS 1:我完全同意,Node是异步工作,我们应该避免这种情况,但这是一个单独的非实时过程。PS 2:如果没有Node任何其他Serverside JS框架?最后一个选项是使用其他lang类似python,但如果JS中的任何内容可能,我们都准备好试一试!
答案 0 :(得分:0)
有很多选项,请查看node-async,kaffeine异步支持,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或某些并发库中那样)。