Вызов метеорного метода внутри обратного вызова 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');
}
});
}