我正在尝试使用异步函数,将其包装并调用它:
s3 = new AWS.S3();
Meteor.methods({
getbuckets: function( params, buckets ) {
var buckets = Meteor.wrapAsync(
s3.listBuckets( params, function( err, data ) {
if ( err ) {
console.log( err, err.stack ); // error
} else {
return buckets;
}
return {};
}) // End listBuckets
); // End wrapAsync
return buckets( params );
}
});
调用方法时,我收到此错误:
TypeError:对象#没有方法'apply'
这指向buckets( params )
答案 0 :(得分:4)
Meteor.wrapAsync采用现有的异步方法方法,例如s3.listBuckets
。第二个参数包含应绑定的上下文this
。这应该有效:
Meteor.methods({
getbuckets: function(params) {
var listBuckets = Meteor.wrapAsync(s3.listBuckets, s3)
return listBuckets(params);
}
});
答案 1 :(得分:1)
Meteor.wrapAsync
将函数作为参数。你正在做的是执行函数s3.listBuckets
并将返回值作为参数传递给Meteor.wrapAsync
。哪个没有原型Function
。所以你需要做的是将它包装在匿名函数中,如下所示:
Meteor.methods({
getbuckets: function( params, buckets ) {
var buckets = Meteor.wrapAsync(
function bucketLister (params, resolveFuture) {
s3.listBuckets( params, function( err, data ) {
if ( err ) {
console.log( err, err.stack ); // error
resolveFuture(false)
} else {
resolveFuture(buckets);
}
return {};
}) // End listBuckets
} // End bucketLister
); // End wrapAsync
return buckets( params );
}
});
传递给Meteor.wrapAsync
的函数接受函数resolveFuture
作为其参数。我们将实际的返回值传递给它。要了解详情,请查看meteor source code或the fibers documentation on resolver
s