我在Meteor(nodejs框架)中有以下代码
dbAllSync = Meteor._wrapAsync(db.all.bind(db))
rows = dbAllSync(query)
使用上面的代码,我能够完全阻止db调用,即代码执行只会在获取查询结果后继续执行。
如何在不使用Meteor._wrapAsync的情况下在nodejs中实现相同的完整块代码执行?
P.S。 - 我尝试过“同步”和“同步”节点包。它没有服务于我的目的。它们没有完整的代码块执行,但是没有阻塞代码执行。
另外,我知道full-block违反了nodejs原则。但是我有一些要求要实现,因此我希望nodejs在代码中的某些点处是完全阻塞的。
提前致谢。
答案 0 :(得分:0)
在幕后,Meteor.wrapAsync
是fibers/future
库的包装。
https://github.com/laverdet/node-fibers
光纤机制并没有完全阻止节点事件循环,整个过程以非阻塞异步方式执行内容,它只是与开发人员同步。
这与fs
函数(如writeSync
非常不同,这些函数真正阻止了该过程。
编辑:添加一些样板代码:
var Future=require("fibers/future");
var future=new Future();
api.someAsyncFunc(params,future.resolver());
future.wait();
您可以深入了解node-fibers npm模块的文档,以找到有关Future.wrap
等精美包装功能的更多信息。