Работа с функциями сбалансированных платежей Meteor и Async

Я использую сбалансированные платежи и их версию 1.1 balance.js в Meteor.

Я пытаюсь создать нового клиента, используя 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

Есть ли какое-то конкретное изменение, которое необходимо сделать в отношении работы со сбалансированностью здесь? Есть ли у кого-нибудь советы по работе с асинхронными функциями или что-то конкретное в моем коде, что я сделал неправильно?

Спасибо


person JoshJoe    schedule 16.05.2014    source источник


Ответы (3)


Утилиты NPM Async.wrap делают то же самое, что и недокументированная функция Meteor Meteor._wrapAsync, в том смысле, что она берет асинхронную функцию с последним аргументом function(err, result) {} и превращает ее в синхронную функцию, которая принимает те же аргументы, но вместо этого либо возвращает результат, либо выдает ошибку. использования обратного вызова. Функция уступает в волокне до тех пор, пока не вернется асинхронный обратный вызов, чтобы мог выполняться другой код в цикле событий.

Одна из ловушек заключается в том, что вам нужно убедиться, что функция, которую вы переносите, вызывается с правильным контекстом. Таким образом, если balanced.marketplace.customers.create является методом-прототипом, который ожидает, что this будет установлен на что-то, он не будет установлен правильно, если вы не привяжете его самостоятельно, используя function.bind или любой другой полифилл библиотеки.

Дополнительные сведения см. на странице https://stackoverflow.com/a/21542356/586086.

person Andrew Mao    schedule 03.06.2014

В итоге я использовал будущее. Это прекрасно работает, мне просто нужно лучше ловить ошибки. Что будет вопросом для профи, я думаю; - )

Следует отдать должное пользователю 3374348 за ответ на другой мой аналогичный вопрос, который решил оба этих вопроса. 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" })); 
    });
person JoshJoe    schedule 03.06.2014

Как упомянул Эндрю, вам нужно установить контекст для метода.

Вот как это можно сделать с помощью Async.wrap

Async.wrap(balanced.marketplace.customers, "create");
person Arunoda Susiripala    schedule 28.06.2014
comment
Когда я использую это, функция никогда не возвращается из вызова сервера. Как будто асинхронная функция не переходит к следующему шагу - person JoshJoe; 01.07.2014
comment
Хорошо, у сбалансированного API есть обещания. Тогда это не работает. Вам нужно использовать фьючерсы напрямую или Async.runSync - person Arunoda Susiripala; 02.07.2014
comment
Хорошо, мне все еще нужно установить контекст для метода перед запуском Async.runSync? У вас есть еще примеры Aysnc.runSync? Я пытаюсь использовать его сейчас, но я получаю неопределенные данные, я все еще не верю, что правильно его настроил. - person JoshJoe; 02.07.2014