我有一个严格的JavaScript API命名方案,我需要遵循它,它看起来像这样:
var Items = function() {
this.items = [];
};
Items.prototype.get() {
db.items.find(function(err, items) {
this.items = items;
});
return this.items;
}
问题是异步调用(db.items.find ..)在get()方法返回空this.items之前没有时间完成..
客户需要像这样进行调用:
items = new Items();
console.log(items.get());
在遵循API命名方案严格的同时处理异步调用的最佳做法是什么?
是否有一些本机方式我可以让get()等待回调内部的回复,或者我是否需要某种异步lib?
答案 0 :(得分:0)
编辑:
使用wait.for(https://github.com/luciotato/waitfor)显然可能正在寻找什么。我没有用它,所以我不确定它能满足你的需求。您需要的方法是wait.forMethod
。
上一个答案:
您无法以同步方式编写异步代码。此外,混合异步和同步方法不是一个好主意。您正在尝试定义同步方法Item.prototype.get
,但在其中您正在使用异步方法db.items.find
,这使Item.prototype.get
成为异步函数。为了使其工作,您必须将Item.prototype.get定义为具有回调的正确异步函数。
Items.prototype.get(fn) {
db.items.find(function(err, items) {
return fn(err, items);
});
}
然后您可以将其称为
items = new Items();
items.get(function(err, items){
console.log(items);
}
答案 1 :(得分:0)
我设法通过使用SilkJS(http://www.silkjs.net/)来解决这个问题,它类似于Node,因为它是在V8的顶层构建的,但它以同步模式运行。
这样我就设法保留了给定的API规范。