使用Meteor和Async均衡支付功能

时间:2014-05-16 15:10:10

标签: meteor balanced-payments

我在Meteor中使用平衡付款及其1.1版本的balanced.js。

我正在尝试使用创建新客户 balanced.marketplace.customers.create(formData);

这是我的CheckFormSubmitEvents.js文件

Template.CheckFormSubmit.events({
    'submit form': function (e, tmpl) {
        e.preventDefault();
        var recurringStatus = $(e.target).find('[name=is_recurring]').is(':checked');
        var checkForm = {
            name: $(e.target).find('[name=name]').val(),
            account_number: $(e.target).find('[name=account_number]').val(),
            routing_number: $(e.target).find('[name=routing_number]').val(),
            recurring: { is_recurring: recurringStatus },
            created_at: new Date
        }
        checkForm._id = Donations.insert(checkForm);

            Meteor.call("balancedCardCreate", checkForm, function(error, result) {
                console.log(result);
                // Successful tokenization
            if(result.status_code === 201 && result.href) {
                // Send to your backend
                jQuery.post(responseTarget, {
                    uri: result.href
                }, function(r) {
                    // Check your backend result
                    if(r.status === 201) {
                        // Your successful logic here from backend
                    } else {
                        // Your failure logic here from backend
                    }
                });
            } else {
                // Failed to tokenize, your error logic here
            }

            // Debuging, just displays the tokenization result in a pretty div
            $('#response .panel-body pre').html(JSON.stringify(result, false, 4));
            $('#response').slideDown(300);
            });
      }
});

这是我的Methods.js文件

var wrappedDelayedFunction = Async.wrap(balanced.marketplace.customers.create);

Meteor.methods({
    balancedCardCreate: function (formData) {
        console.log(formData);
        var response =  wrappedDelayedFunction(formData);
        console.log(response);
        return response;    
    }
});

我提交表单时没有得到任何回复,除了在服务器控制台上我看到表单数据的日志。

我确定我没有正确调用其中一些异步功能。对我来说,困难的部分是平衡功能是异步的,但我不知道它们是否与我见过的一些例子相同。

我已尝试按照此示例代码操作。 http://meteorhacks.com/improved-async-utilities-in-meteor-npm.html

在这里平衡工作方面是否需要做出具体改变?有没有人有任何使用异步功能的技巧或看到我的代码特定的一些我做错了?

谢谢

3 个答案:

答案 0 :(得分:2)

NPM实用程序Async.wrap与未记录的Meteor函数Meteor._wrapAsync执行相同的操作,因为它使用最后一个参数function(err, result) {}的异步函数并将其转换为同步函数采用相同的参数,但要么返回结果,要么抛出错误而不是使用回调。该函数在光纤中产生,直到异步回调返回,以便事件循环中的其他代码可以运行。

这样做的一个缺陷是你需要确保使用正确的上下文调用你包装的函数。因此,如果balanced.marketplace.customers.create是一个期望this被设置为某事的原型方法,除非您自己使用function.bind或任何其他各种库polyfill将其绑定,否则它将无法正确设置

有关详细信息,请参阅https://stackoverflow.com/a/21542356/586086

答案 1 :(得分:0)

我最终做的是使用未来。这很好用,我只需要更好地捕捉错误。对于我认为的专业人士来说,这将是一个问题; - )

应该转到user3374348来回答我的另一个类似的问题,这解决了这两个问题。 https://stackoverflow.com/a/23777507/582309

    var Future = Npm.require("fibers/future");

      function extractFromPromise(promise) {
        var fut = new Future();
        promise.then(function (result) {
          fut["return"](result);
        }, function (error) {
          fut["throw"](error);
        });
        return fut.wait();
      }

    Meteor.methods({
      createCustomer: function (data) {
      balanced.configure(Meteor.settings.balancedPaymentsAPI);

      var customerData =  extractFromPromise(balanced.marketplace.customers.create({
        'name': data.fname + " " + data.lname,
        "address": {
          "city": data.city,
          "state": data.region,
          "line1": data.address_line1,
          "line2": data.address_line2,
          "postal_code": data.postal_code,
        },
        'email': data.email_address, 
        'phone': data.phone_number
        }));
var card = extractFromPromise(balanced.marketplace.cards.create({
          'number': data.card_number,
          'expiration_year': data.expiry_year,
          'expiration_month': data.expiry_month,
          'cvv': data.cvv
        }));
          var associate = extractFromPromise(card.associate_to_customer(customerData.href).debit({
          "amount": data.total_amount*100,
          "appears_on_statement_as": "Trash Mountain" })); 
    });

答案 2 :(得分:0)

正如Andrew所说,你需要为方法设置上下文。

您可以使用Async.wrap

来实现这一目标
Async.wrap(balanced.marketplace.customers, "create");