如何在coffeescript(或javascript)中等待回调?

时间:2011-09-29 06:41:28

标签: javascript asynchronous callback coffeescript pbkdf2

我正在使用密码管理器webapp,它使用Parvez Anandam的pbkdf2.js进行密钥生成(即将文本密码转换为适合AES的256位密钥)。我正在使用该项目来学习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

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

1 个答案:

答案 0 :(得分: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时,您将提供keygen功能,finished会在key可用时执行任何需要执行的操作。你的finished通常是匿名关闭。

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