1

我正在开发一个密码管理器 webapp,它使用 Parvez Anandam 的 pbkdf2.js 生成密钥(即将文本密码转换为适合 AES 的 256 位密钥)。我正在使用该项目来学习咖啡脚本。我无法从回调中获取数据。这是我的代码:

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

由于deriveKey 立即返回,我没有数据——最后一行打印“1”。处理这个问题的正确方法是什么?在 java 中,我希望得到一个类似 Future 的对象,我可以加入或等待,但我意识到我的后端习惯可能不适合 UI 代码。我应该从继续加密并提交表单的回调中调用“继续”函数吗?

4

1 回答 1

3

通常的方法是发送一个回调函数,异步任务完成后可以调用该回调函数。像这样的东西:

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调用时提供该功能,keygenfinished在可用时执行任何需要完成的工作key。你finished通常是一个匿名的闭包。

如果您查看任何 AJAX 库(例如 jQuery),您会看到很多这样的事情:您将函数传递给函数,函数一直向下传递。

于 2011-09-29T06:58:17.467 回答