Как мне ждать обратного вызова в coffeescript (или javascript)? - PullRequest
1 голос
/ 29 сентября 2011

Я работаю над веб-приложением диспетчера паролей, которое использует pbkdf2.js от Parvez Anandam для генерации ключей (то есть превращение текстового пароля в подходящий 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, к которому я могу присоединиться или ждать, но я понимаю, что мои привычки бэкэнда могут не подходить для кода пользовательского интерфейса.Должен ли я вызывать функцию продолжения от обратного вызова, который переходит к шифрованию и отправке формы?

1 Ответ

3 голосов
/ 29 сентября 2011

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

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): вы передаете функции в функции, функциивесь путь вниз.

...