2013-08-27 56 views
0

我有我需要遵循严格的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命名方案仍然严格

是否有一些本地方式,我可以让()等待回调里面的回调还是我需要某种异步库吗?

+0

我不清楚命名方案与你的问题有什么关系,这似乎更多关于异步问题。你是否试图说你不能改变'.get()'方法的名称或参数(所以你不能设置它来使用回调或其他)? – nnnnnn

+0

@nnnnnn,我就是这么说的。我需要遵守这个命名方案(不会更改.get())的名称或参数),原因有很多。 – Niklas9

+0

无论您是否严格要求,都无法在JavaScript中进行异步调用。虽然像C#这样的语言支持使异步编程易于阅读和编程,但JavaScript具有回调。 (在C#中,'Console.Writeline(await items.Get())')。 – WiredPrairie

回答

0

我设法用SilkJS(http://www.silkjs.net/),这是类似的节点,它之上构建V8来解决这一点,但它在同步运行模式。

这种方式我设法保持给定的API规范。

+0

这可能是一个愚蠢的问题,但你是否尝试过在回调中返回? – DrakaSAN

+0

@DrakaSAN是的,这只是返回做回调调用,这是预计将无效 – Niklas9

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); 
} 
+0

感谢您分享此内容。我现在尝试了waitfor,但是我无法让它与猫鼬一起工作,请参阅我的要点 - https://gist.github.com/Niklas9/6370614。它只是输出'之前',似乎死于第13行.. – Niklas9

+0

此外,行20(wait.launchFiber(test);)显然是必需的,因为这是什么使程序运行功能测试的实际调用..我怎么可能用我的API规范来实现?我想.get()来做这个调用,而不是wait.launchFiber() – Niklas9

+0

我还没有真正使用过wait.for,所以我不能帮你解决问题。但是,如果wait.for不适合你,也许ES6生成器(http://blog.alexmaccaw.com/how-yield-will-transform-node)会? – asleepysamurai