Я пишу плагин для Atom в CoffeeScript, и я использую this nodejs API (telegram.link). Он имеет некоторые асимметричные функции, поэтому мне приходится передавать функции в качестве параметров, которые вызываются как обратные вызовы. Моя проблема заключается в том, что, когда я использую следующий код:Функция CoffeeScript как параметр в node.js API
login: ->
console.log 'Loging in'
@client = telegramLink.createClient({
id: config.telegram.prod.app.id,
hash: config.telegram.prod.app.hash,
version: '0.0.1',
lang: 'en'
},
config.telegram.prod.primaryDataCenter);
@client.createAuthKey(@authCallback)
console.log @client
authCallback: (auth) ->
console.log auth
@client.auth.sendCode(config.telegram.test.telNr, 5, 'en', @sendCodeCallback)
, который компилируется в:
login: function() {
console.log('Loging in');
this.client = telegramLink.createClient({
id: 12345,
hash: 'q1w2e3r4t5y6u7i8o9p0',
version: '0.0.1',
lang: 'en'
}, config.telegram.prod.primaryDataCenter);
this.client.createAuthKey(this.authCallback);
return console.log(this.client);
},
authCallback: function(auth) {
console.log(auth);
return this.client.auth.sendCode(config.telegram.test.telNr, 5, 'en', this.sendCodeCallback);
}
@client
не определено в функции authCallback.
Я читал на Stackoverflow (CoffeeScripts classes - access to property in callback), что я должен использовать =>
(жирную стрелку), поэтому я попытался это приводит к следующему скомпилированного скрипта:
authCallback: (function(_this) {
return function(auth) {
console.log(auth);
return _this.client.auth.sendCode(config.telegram.test.telNr, 5, 'en', _this.sendCodeCallback);
};
})(this)
Но @client
остается неопределенным. Я думаю, что, возможно, вызов функции обратного вызова из API работает некорректно.
Что еще я могу сделать, чтобы сохранить исходный объем, но заставить его работать с API?
Как называется вызов 'authCallback'? Имейте в виду, что 'this' в функции сценария (Java | Coffee) зависит от того, как вызывается функция, а не от того, как и где она определена (за исключением связанных функций). Использование '=>' должно сделать трюк. Вы посмотрели, что '@' находится внутри 'authCallback'? Вы уверены, что сначала вызываете «login»? Вы уверены, что вызываете 'login' и' authCallback' на одном и том же объекте? –
@muistooshort Из исходного кода API 'if (callback) { this.client.once ('sendCode', callback); } '. API написан в чистых узлах, а не в CoffeeScript, поэтому нет '@'. Да, я уверен, что я назвал логин первым, потому что он запускается кнопкой меню в Atom. Если вы хотите увидеть весь код проекта, я поделился им с [Github] (https://github.com/Morosko/atom-telegram). – Morosko
'@' - сокращенное обозначение CoffeeScript для 'this', поэтому' @ 'есть , Я не знаю, что это: this.client.once ('sendCode', callback) 'делает так, что вам придется копать глубже. Или вы можете 'console.log (@)' в 'authCallback' и посмотреть сами. –