2013-04-20 4 views
5

Я работал с Meteor и пакетом полосок, чтобы попытаться сделать клиента. Итак, сначала у меня на стороне клиента код, который вызывает метод на сервере, поэтому при нажатии у меня есть в client.js:Получение звонка с метеоритом, чтобы вернуть ответные реакции на полосы.

Meteor.call('usersignup', function (error, result) { 
    console.log (result); 
}); 

Таким образом, это вызывает метод на server.js:

var Future = Npm.require('fibers/future'); 
var stripe = StripeAPI('my key'); // secret stripe API key 

Meteor.methods({ 

    usersignup: function(cusEmail){ 
     var fut = new Future(); 

     stripe.customers.create(
      { email: cusEmail }, 
      function(err, customer) { 
       if (err) { 
        console.log(err); 
        fut.ret; 
       } 
       fut.ret(customer); 
      } 
      ); 
     return fut.wait(); 
    }, 

    userfail: function(cusid){ 
     var fut = new Future(); 

     stripe.customers.retrieve(cusid, function(err, result) { 
      if(err){ 
        console.log(err); 
        fut.ret; 
       } 
       fut.ret(err, result); 
      }); 
     return fut.wait(); 
    } 

}); 

Теперь это работает и создает клиента, когда я вхожу на панель инструментов stripe.com, но я пытаюсь получить ответ, возвращенный клиенту, по крайней мере, на идентификаторе клиента и распечатать его в консоли. Здесь я не могу заставить его работать. Это будет log undefined, когда я сделаю console.log (результат). Есть идеи?

EDIT: Таким образом, я поместил волокно и полосу в качестве глобальных переменных сейчас и не получаю ошибку, но возвраты, похоже, не возвращают никаких значений. так на стороне клиента, у меня есть:

'click #signupsubmit': function (event) { 
    console.log("hello"); 
    var whatis = getVal(); // function gets value of forms and returns object 
    var testid; 
    var cusid = Meteor.call('usersignup', whatis.email, function (error, result) { 
     if (error) { 
      console.log(err.message); 
      return; 
     } 
     console.log(result); 
     console.log("meteor call"); 
     testid = result; 
     return (result); 
    }); 
    console.log("outside call"); 
    console.log(testid); 
    console.log(cusid); 
    }, 
}); 

Так я уже работает несколько тестов console.log и, кажется, он выполняет meteor.call и продолжает идти вниз линию. Console.log обоих testid и cusid return undefined, но через пару секунд я получаю console.log результата и строку «meteor call» изнутри meteor.call. Есть ли способ подождать завершения вызова метеорита, а затем запустить остальную часть функции клика? поэтому вывод на консоль будет идти, как:

  • "привет"
  • "Внешний вызов"
  • тест идентификатор не определен
  • cusid неопределенную
  • "метеоритный вызов" "результат"
  • ответ

    9

    Имейте в виду, что API полосы не использует волокна. Вам нужно поместить его вручную. Обратный вызов не доходит до клиента, потому что к тому времени он уже получил бы ответ (его асинхронный)

    Вы можете использовать что-то вроде этого, чтобы ожидать результата от обратного вызова полосы до того, как результат возвращается клиенту:

    var stripe = StripeAPI('mykeygoeshere'); // secret stripe API key 
    var Future = Npm.require('fibers/future'); 
    
    var fut = new Future(); 
    
    stripe.customers.create(
        { email: '[email protected]' }, 
        function(err, customer) { 
         if (err) { 
          console.log(err.message); 
          fut.ret; 
         } 
         fut.ret("customer id", customer.id); 
        } 
    ); 
    return fut.wait(); 
    

    Здесь в Future используется, и он ждет результат будет получен от полосы обратного вызова до того, как результат возвращается к клиенту.

    Более подробную информацию можно найти на волокнах/Futures & Синхронные Callbacks incuding, как идти о них &, когда использовать их:

    1. Meteor: Calling an asynchronous function inside a Meteor.method and returning the result
    2. https://github.com/laverdet/node-fibers
    3. https://gist.github.com/possibilities/3443021
    +0

    Это работало замечательно, но когда я пошел, чтобы сделать еще один метод, который, например, будет удалить клиент он бросает Ошибка с («Будущее разрешено более одного раза»). Поэтому прямо сейчас кто-то нажимает кнопку «Отправить», получает всю информацию из формы и создает stripe.customer, а затем создает Meteor.user, но говорит, что Accounts.createUser выдает ошибку. Я запускаю метод удаления клиента полосы. После того, как я вызываю свой метод stripe del, он дает ошибку. – asiammyself

    +0

    Не могли бы вы опубликовать обновленный код? Мне нужно немного больше, чтобы продолжить, но я считаю, что, возможно, есть несколько возвратов, поэтому вам нужно убедиться, что fut.ret работает только один раз – Akshat

    +0

    Обновленный код. Сделано будущее глобальным var. Не знаю, будет ли это правильным способом справиться с этим, но работает пока. Функция по-прежнему не ожидает возврата в отредактированном сообщении. – asiammyself

    1

    Вот что-то более простое.Метеор теперь Meteor.wrapAsync() для такой ситуации:

    var stripe = StripeAPI("key");  
    Meteor.methods({ 
    
        yourMethod: function(callArg) { 
    
         var charge = Meteor.wrapAsync(stripe.charges.create, stripe.charges); 
         charge({ 
          amount: amount, 
          currency: "usd", 
          //I passed the stripe token in callArg 
          card: callArg.stripeToken, 
         }, function(err, charge) { 
          if (err && err.type === 'StripeCardError') { 
           // The card has been declined 
           throw new Meteor.Error("stripe-charge-error", err.message); 
          } 
    
          //Insert your 'on success' code here 
    
         }); 
        } 
    }); 
    

    Я нашел этот пост действительно полезный: Meteor: Proper use of Meteor.wrapAsync on server

    +0

    Как узнать на клиенте, что происходит? Я получаю undefined результаты после вызова этого метода сервера. – quape