Meteor wrapAsync没有方法'apply'

时间:2015-06-22 14:41:52

标签: asynchronous meteor

我正在尝试使用异步函数,将其包装并调用它:

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 )

的行

2 个答案:

答案 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 codethe fibers documentation on resolvers