Вызов метеорного метода внутри обратного вызова Promise [Остановка без ошибки]

Я пытаюсь использовать этот пакет NPM: Gumroad-API внутри моего приложения Meteor. У меня возникают проблемы на стороне сервера, когда я пытаюсь выполнить вызов метода Meteor (или вставку коллекции) внутри обратного вызова Promise.

Ниже приведен код для двух моих методов Meteor:

Meteor.methods({

  testMethod: () => {
    console.log('TEST METHOD RUN');
  },

  fetchGumroadData: () => {
    const Gumroad = Meteor.npmRequire('gumroad-api');
    let gumroad = new Gumroad({ token: Meteor.settings.gumroadAccessKey });

    Meteor.call('testMethod');        // runs fine

    gumroad.listSales('2014-12-04', '2099-12-04', 1).then((result) => {
      console.log('1');               // runs fine
      Meteor.call('testMethod');      // execution halts here w/o error msg
      console.log('2');               // this never runs
    });
  },
});

Код внутри .then() обратный вызов всегда останавливается (без сообщений об ошибках) всякий раз, когда я пытаюсь сделать Meteor.call() внутри него.

Я получаю такое же поведение, когда заменяю Meteor.call() с Collection.insert() такие как: Sales.insert({text:'test'});,

3 ответа

Старый вопрос, но причина этого не в том, что среда Meteor недоступна в вашем обратном вызове.

будьте осторожны

Meteor.methods({

  testMethod: () => {
    console.log('TEST METHOD RUN');
  },

  fetchGumroadData: () => {
    const Gumroad = Meteor.npmRequire('gumroad-api');
    let gumroad = new Gumroad({ token: Meteor.settings.gumroadAccessKey });

    Meteor.call('testMethod');        // runs fine

    gumroad.listSales('2014-12-04', '2099-12-04', 1)
      .then(Meteor.bindEnvironment((result) => {
        console.log('1');               // runs fine
        Meteor.call('testMethod');      // execution halts here w/o error msg
        console.log('2');               // this never runs
      }));
    },
});

Учебные руководства по bindEnvironment и wrapAsync можно найти здесь: https://www.eventedmind.com/items/meteor-what-is-meteor-bindenvironment

Я мало пользуюсь обещаниями, поэтому не знаю, почему вы видите эту ошибку. При использовании подобных внешних API я обычно использую wrapAsync, поэтому я могу писать свой код синхронно, но при этом достигать тех же результатов.

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

Meteor.methods({

  testMethod: () => {
    console.log('TEST METHOD RUN');
  },

  fetchGumroadData: () => {
    const Gumroad = Meteor.npmRequire('gumroad-api');
    let gumroad = new Gumroad({ token: Meteor.settings.gumroadAccessKey });

    Meteor.call('testMethod');        // runs fine

    let wrappedListSales = Meteor.wrapAsync(gumroad.listSales, gumroad);

    let result = wrappedListSales('2014-12-04', '2099-12-04', 1);

    console.log('1');               
    Meteor.call('testMethod');      
    console.log('2');               
  },
});

Второй аргумент Meteor.wrapAsync является необязательным и может не потребоваться в зависимости от характера API gumroad.

Я закончил тем, что отказался от пакета NPM и написал свой собственный вызов API. Я никогда не мог понять, как сделать свой звонок внутри .then(), Вот код:

fetchGumroadData: () => {
  let options = {
    data: {
      access_token: Meteor.settings.gumroadAccessKey,
      before: '2099-12-04',
      after: '2014-12-04',
      page: 1,
    }
  };
  HTTP.call('GET', 'https://api.gumroad.com/v2/sales', options, (err,res) => {
    if (err) {  // API call failed
      console.log(err);
      throw err;
    } else {    // API call successful
      Meteor.call('testMethod');
    }
  });
}
Другие вопросы по тегам