【问题标题】:Problems with my async wrapping Meteor package我的异步包装 Meteor 包的问题
【发布时间】:2014-09-01 17:53:08
【问题描述】:

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

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

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

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

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 项目,添加了我的包,仅此而已):

// 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 的东西,但有人告诉我用异步编写一个智能包包装器会比我以前做的要好得多。

任何帮助将不胜感激。

【问题讨论】:

    标签: javascript node.js asynchronous meteor


    【解决方案1】:

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

    【讨论】:

    • 我会试一试并尽快报告。谢谢!
    • 它似乎仍然崩溃。这是我现在遇到的错误:imgur.com/XVoupoH
    • 我有没有办法只包装apac 的 GitHub 变体与 NPM 版本?
    • package.js 中的Npm.depends 中可能会这样做。无论哪种方式,我检查了apac 源,它似乎有时会同时调用结果回调和错误回调。我编辑了解决这个问题的答案。
    • 似乎可以将特定的 github 提交 tarball URL 传递到 Npm.depends,请参见:github.com/meteor/meteor/issues/844
    猜你喜欢
    • 2015-04-01
    • 1970-01-01
    • 2015-10-18
    • 1970-01-01
    • 2013-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多