我的异步包装Meteor包的问题

时间:2014-08-29 03:44:22

标签: javascript node.js asynchronous meteor

我目前正试图创作我的第一个Meteor智能套装,并遇到了问题。

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

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

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

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);

似乎是以它应该的方式扩展原型(我认为),但当我使用以下代码调用它时(我刚刚创建了一个准系统Meteor项目,添加了我的包,那& #39;所有):

// 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的截图,代码正在执行: error screenshot

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

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

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,因为它是一个重大变化。)

我想当apac将结果作为回调的第一个参数传递时,_wrapAsync会将错误视为错误,并抛出异常。

在传入_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);
  });
});