我的asynchronous包装meteor包的问题

我正在尝试编写我的第一个Meteor智能包,并且遇到了问题。

我正在尝试编写一个封装了以下node.js模块的包: https : //github.com/dmcquay/node-apac

我被告知这样做,我应该使用Meteor._wrapAsync封装OperationHelper.execute()方法,以避免在将来的项目中使用它时callback地狱。

我目前在我的包中有以下代码:

 apac = Npm.require("apac"); OperationHelper = apac.OperationHelper; function makeSyncMethod(method){ var wrapped=Meteor._wrapAsync(method); var syncMethod=function(){ return wrapped.apply(this,arguments); }; return syncMethod; } OperationHelper.prototype.executeSync = makeSyncMethod(OperationHelper.prototype.execute); 

它似乎是按照它应该(我认为)的方式扩展原型,但是当我使用下面的代码来调用它时(我刚刚创build了Meteor项目的准系统,添加了我的包,就这些了):

 // Test of APAC stuff, maybe. Meteor.startup(function() { opHelper = new OperationHelper({ awsId: "<key>", awsSecret: "<key>", assocId: "<id>" }); var test = opHelper.executeSync('ItemLookup', { SearchIndex: 'Books', ResponseGroup: 'Small,Images', IdType: 'ISBN', ItemId: '9780078025600' }); console.log(JSON.sringify(test)); }); 

我得到了下面的输出(最好的办法是从VM中执行代码的截图: 错误截图

我不知道发生了什么事。 我是Meteor的新手,之前只是通过meteor-npm使用这个apac的东西,但是我被告知用async编写一个智能的包裹包装会比我以前做的要好得多。

任何帮助将不胜感激。

Meteor._wrapAsync期望它包装的函数使用标准的node.js function (err, result)错误报告约定:

 doSomethingAsync(arg1, arg2, function (err, result) { if (err) { // error occurred } else { // all is well } }); 

但是, apac使用不同的错误报告约定:

 opHelper.execute("...", { //... }, function (result) { // all is well }, function (err) { // error occurred }); 

(GitHub仓库中的apac版本使用标准惯例,但是由于这是一个突破性的变化,所以还没有推到npm。)

_wrapAsync作为callback的第一个parameter passing结果时, _wrapAsync错误地发生错误,并引发exception。

在传递到_wrapAsync之前,必须转换为node.js约定。 尝试这个:

 OperationHelper.prototype.executeSync = Meteor._wrapAsync(function (name, args, callback) { callback = _.once(callback); // work around apac bug this.execute(name, args, function (result) { callback(null, result); }, function (err) { callback(err); }); });