Asynchronous Meteor wrapAsync没有方法';应用';

Asynchronous Meteor wrapAsync没有方法';应用';,asynchronous,meteor,Asynchronous,Meteor,我试图获取一个异步函数,将其包装并调用: s3 = new AWS.S3(); Meteor.methods({ getbuckets: function( params, buckets ) { var buckets = Meteor.wrapAsync( s3.listBuckets( params, function( err, data ) { if ( err ) {

我试图获取一个异步函数,将其包装并调用:

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:对象#没有“应用”方法


这是指向带有
bucket(params)
Meteor的行。wrapAsync
将函数作为参数。您所做的是执行函数
s3.listbackes
,并将返回值作为参数传递给
Meteor.wrapAsync
。它没有原型
功能
。因此,您需要将其包装在一个匿名函数中,如下所示:

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
作为其参数。我们将实际返回值传递给它。要了解更多信息,请检查or

Meteor.wrapAsync采用现有的异步方法,例如
s3.listbugkets
。第二个参数包含该应绑定到的上下文
。这应该起作用:

Meteor.methods({
    getbuckets: function(params) {            
        var listBuckets = Meteor.wrapAsync(s3.listBuckets, s3)
        return listBuckets(params);
    }
});