Как дождаться обратного вызова в coffeescript (или javascript)?

Я работаю над веб-приложением диспетчера паролей, которое использует pbkdf2.js Парвеза Анандама для генерации ключей (то есть превращая текстовый пароль в подходящий 256-битный ключ для AES). Я использую проект для изучения coffeescript. У меня возникли проблемы с получением данных из обратных вызовов. Вот мой код:

keygen = (password, salt, iterations) ->
  key = 1
  pbkdf = new PBKDF2 password, salt, iterations, size_in_bytes
  pbkdf.deriveKey ((p) ->), ((k) ->
    key = k
    console.log "within callback " + key
    )
  console.log "straight line path " + key

Поскольку производный ключ возвращается немедленно, у меня нет данных — в последней строке выводится «1». Каков правильный способ справиться с этим? В java я ожидал бы вернуть объект, похожий на Future, к которому я мог бы присоединиться или подождать, но я понимаю, что мои бэкэнд-привычки могут не подходить для кода пользовательского интерфейса. Должен ли я вызывать функцию «продолжить» из обратного вызова, которая переходит к шифрованию и отправке формы?


person Kevin Peterson    schedule 29.09.2011    source источник


Ответы (1)


Обычный подход заключается в отправке функции обратного вызова, которую асинхронная задача может вызвать после завершения. Что-то вроде этого:

keygen = (password, salt, iterations, finished) ->
  key = 1
  pbkdf = new PBKDF2 password, salt, iterations, size_in_bytes
  pbkdf.deriveKey ((p) ->), ((k) ->
    key = k
    console.log "within callback " + key
    finished key
    )
  console.log "straight line path " + key

Таким образом, вы бы предоставили функцию finished при вызове keygen, а finished сделала бы все, что нужно сделать, когда key доступна. Ваш finished обычно был бы анонимным закрытием.

Вы увидите много подобных вещей, если посмотрите на любую из библиотек AJAX (например, jQuery): вы передаете функции функциям, функции полностью вниз.

person mu is too short    schedule 29.09.2011