0

I have a strict JavaScript API naming scheme I need to follow, it looks like this:

var Items = function() {
    this.items = [];
};

Items.prototype.get() {
    db.items.find(function(err, items) {
        this.items = items;
    });
    return this.items;
}

The problem is the async call (db.items.find..) that doesn't have time to finish before the get() method returns an empty this.items..

The client needs to make the calls like this:

items = new Items();
console.log(items.get());

What's best practice to handle async calls here while still strictly following the API naming scheme?

Is there some native way I can let get() wait for a return inside the callback or do I need some kind of async lib for this?

4

2 回答 2

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);
}
于 2013-08-27T11:37:01.573 回答
0

我设法通过使用 SilkJS ( http://www.silkjs.net/ ) 解决了这个问题,它与 Node 类似,因为它构建在 V8 之上,但它以同步模式运行。

通过这种方式,我设法保留了给定的 API 规范。

于 2014-01-03T16:04:23.517 回答