我目前正试图创作我的第一个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的截图,代码正在执行:
我不知道发生了什么事。我是Meteor的新手,之前只是通过meteor-npm
使用这个apac的东西,但我被告知写一个带有异步的智能包裹包装会比我以前做得好得多。
非常感谢任何帮助。
答案 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);
});
});