WePay Meteor无法获得Credit_card_id

时间:2016-12-21 09:10:52

标签: javascript meteor wepay

在Meteor Server文件夹中,我有这个main.js文件。 在main.js文件中,我添加了这段代码,

saveCC(data){
    var cc = "";
    ...
    wp.call('/credit_card/create',
        {
            'client_id': some_id,
            'cc_number': data.ccn,
            'cvv': data.cvv,
            'expiration_month': data.em,
            'expiration_year': data.ey,
            'user_name': data.name,
            'email': data.eadd,
            'address': {
                'country': 'US',
                'postal_code': data.postal,
            }
        },
        function(response) {
            if(response.error){
                throw new Meteor.Error("WePay-Form",response.error_description);
            }
            cc = response.credit_card_id;
        }
    );
    return "succesful";
}

我可以获得response.credit_card_id。但它只在wp.call中。这个wp.call函数在Meteor.methods中。我怎样才能获得credit_card_id?如何返回错误?

更具体地说,问题在于,当用户调用saveCC时,即使wp.call尚未完成,它也会返回“成功”消息。所以我没有得到Meteor.error。还有一个错误,它是关于Meteor.error,它只允许在Meteor.methods内部,但不允许在wp.call中。 cc也没有用信用卡更新。

1 个答案:

答案 0 :(得分:0)

当您的流星方法运行时,这就是它的作用,非常快:

  1. 定义名为“cc”
  2. 的var
  3. 进行异步通话
  4. 返回
  5. 稍后,您的异步调用会返回,但无关紧要,因为您的方法已经退出很久了。这有意义吗?

    您需要的是一种机制,在异步调用返回之前,您的方法不会退出。你可以使用期货,它看起来像这样:

    let Future = Npm.require('fibers/future');
    
    Meteor.methods({
        'foo': function() {
            let future = new Future();
    
            wp.call('/credit_card/create',
            {
                'client_id': some_id,
                'cc_number': data.ccn,
                'cvv': data.cvv,
                'expiration_month': data.em,
                'expiration_year': data.ey,
                'user_name': data.name,
                'email': data.eadd,
                'address': {
                    'country': 'US',
                    'postal_code': data.postal,
                }
            },
            function(response) {
                if(response.error){
                    future.throw(new Meteor.Error("WePay-Form",response.error_description));
                }
                cc = response.credit_card_id;
                future.return(cc);
            }
        );
    
            return future.wait();
        }
    });