2015-11-10 2 views
0

Я пишу плагин для 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?

+0

Как называется вызов 'authCallback'? Имейте в виду, что 'this' в функции сценария (Java | Coffee) зависит от того, как вызывается функция, а не от того, как и где она определена (за исключением связанных функций). Использование '=>' должно сделать трюк. Вы посмотрели, что '@' находится внутри 'authCallback'? Вы уверены, что сначала вызываете «login»? Вы уверены, что вызываете 'login' и' authCallback' на одном и том же объекте? –

+0

@muistooshort Из исходного кода API 'if (callback) { this.client.once ('sendCode', callback); } '. API написан в чистых узлах, а не в CoffeeScript, поэтому нет '@'. Да, я уверен, что я назвал логин первым, потому что он запускается кнопкой меню в Atom. Если вы хотите увидеть весь код проекта, я поделился им с [Github] (https://github.com/Morosko/atom-telegram). – Morosko

+0

'@' - сокращенное обозначение CoffeeScript для 'this', поэтому' @ 'есть , Я не знаю, что это: this.client.once ('sendCode', callback) 'делает так, что вам придется копать глубже. Или вы можете 'console.log (@)' в 'authCallback' и посмотреть сами. –

ответ

0

Сегодня я нашел решение проблемы. Теперь мой код выглядит так:

login: -> 
console.log 'Logging 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((auth) => 
    console.log @client.auth 
    @client.auth.sendCode(
    config.telegram.test.telNr, 
    5, 
    'en', 
    @sendCodeCallback)) 
console.log @client 
0

Когда я смотрю на код вашего кода, я бы предположил, что вы не внутри класса. Если вы не находитесь внутри экземпляра класса «this» или «@», это не сработает. Во-вторых, определение обратного вызова. Он не должен определяться как метод вашего класса. Класс может выглядеть примерно так:

class MyClass 
    constructor: -> 
    // do something 
    login: -> 
    @client = telegramLink.createClient({ 
     id: config.telegram.prod.app.id, 
     hash: config.telegram.prod.app.hash, 
     version: '0.0.1', 
     lang: 'en' 

    @client.authCallback: (auth) => 
     console.log auth 
     @client.auth.sendCode(config.telegram.test.telNr, 5, 'en', @sendCodeCallback) 

Это ваша классная вещь работает, Вы должны создать экземпляр, может быть, это не то, что вы хотите.

Вы можете изменить свой код, чтобы он работал так, как вы его определили, только с функциями.

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) 

Подсказка: определение ваших вариантов словаря внутри метод createClient выглядит как JS и не нравится Coffescript. Так же ";" вы не должны использовать. Чтобы смешивать определения, также могут возникнуть некоторые ошибки.

+0

Спасибо за ваш ответ.Мой код находится в классе. Спасибо за подсказку со смесью JS и CoffeeScript. Я просто скопировал его из документации API. – Morosko

Смежные вопросы