将对象返回到回调内的调用函数

时间:2013-08-27 11:18:01

标签: javascript node.js

我有一个严格的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?

2 个答案:

答案 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规范。