Meteor.WrapAsync не возвращает значение

Я пытался заставить работать Meteor.WrapAsync Я прочитал синтаксис Meteor wrapAsync, это видео https://www.eventedmind.com/feed/meteor-meteor-wrapasync, и я просто не могу сообразите, как return ответить на вызов от Stripe. Я использую console.log для печати шагов, и я достигал броска номер 4, что означает, что я достигаю stripe сервера и получаю ответ, но после этого я не понимаю, почему console.log(5) не печатает. пожалуйста, если кто-нибудь может помочь мне понять, почему его wrapAsyn не возвращает обратный вызов полосы?

    //this functions are part of an anonymous function and running in the server side of meteor
    stripe.charge = function (stripeToken) {
        // get a sync version of our API async func
        var strypeChargeSync = Meteor.wrapAsync(stripe.charge.process);

        // call the sync version of our API func with the parameters from the method call

        console.log("1");

        var response = strypeChargeSync(stripeToken);

        console.log("5" + response); ///// this never get print / log
        return response;
    }

    stripe.charge.process = function(stripeToken){
        var _stripe = StripeAPI(stripeKey);
        console.log("2");
        var charge = _stripe.charges.create({
            amount: 1000, // amount in cents, again
            currency: "cad",
            card: stripeToken.id,
            description: "paid@whatever"
        }, function(err, charge) {
            if (err && err.type === 'StripeCardError') {
                alert("Sorry we couldn't charge the money: " + err);
                //console.log(err);
            }else{
                console.log("4");
                //console.log(charge);
                return charge;
            }
        });
        console.log("3");
    }

//текущий выход 1,2,3,4, но никогда не 5 :(

РЕДАКТИРОВАТЬ

вот как у меня закончилась функция Stripe спасибо за поддержку

    var syncFunction = Meteor.wrapAsync(_stripe.charges.create, _stripe.charges);
    var response = syncFunction({
        amount: 1000, // amount in cents, again
        currency: "cad",
        card: stripeToken.id,
        description: "paid@whatever"
    });

person ncubica    schedule 12.10.2014    source источник
comment
Какие-то ошибки в консоли? Я предполагаю, что это происходит потому, что вы не привязали функцию к объекту: Meteor.wrapAsync(stripe.charge.process, stripe.charge)   -  person imslavko    schedule 13.10.2014
comment
ни одной ошибки,и тоже так было в самом начале щас попробую еще раз...   -  person ncubica    schedule 13.10.2014


Ответы (1)


Вы оборачиваете здесь не ту функцию, Meteor.wrapAsync преобразует асинхронную функцию (это означает функцию, которая передает свой результат вызывающей стороне через обратный вызов) в синхронную.

Функция, которую вы передаете Meteor.wrapAsync, не имеет обратного вызова в качестве последнего аргумента, вместо этого вы должны обернуть _stripe.charge.create.

stripe.charge = function (stripeToken) {
  var _stripe = StripeAPI(stripeToken);
  var stripeChargeSync = Meteor.wrapAsync(_stripe.charge.create,_.stripe.charge);
  var response = stripeChargeSync({
    amount: 1000, // amount in cents, again
    currency: "cad",
    card: stripeToken.id,
    description: "paid@whatever"
  });
  return response;
};

Если вы хотите обрабатывать ошибки, вы должны использовать блок try/catch при вызове stripe.charge.

try{
  stripe.charge(STRIPE_TOKEN);
}
catch(exception){
  console.log("Sorry we couldn't charge the money",exception);
}

Я вижу, вы регистрируете свою ошибку, используя alert, вы пытаетесь использовать Meteor.wrapAsync на клиенте? Meteor.wrapAsync предназначен для использования на сервере, поскольку среда, необходимая для обеспечения синхронного выполнения, доступна в Node.js, а не в браузере.

person saimeunt    schedule 12.10.2014
comment
чувак, я не шучу, прямо сейчас я сам обнаруживаю эту глупую ошибку, я должен был написать этот ответ, но ты сделал это раньше, спасибо, чувак, ты заслуживаешь ответа. это очень поможет кому-то в будущем. - person ncubica; 13.10.2014
comment
да, я использую его на стороне сервера, теперь все работает отлично, спасибо... - person ncubica; 13.10.2014
comment
вы не можете получить полный исходный объект ошибки. Мое решение вставлено сюда: github.com/meteor/meteor/issues/2774 - person faceyspacey.com; 21.01.2015
comment
Это очень мне помогло! Спасибо вам, ребята, за это! - person jremi; 19.05.2016