如何在Coffeescript中进行回调函数

zis*_*she 11 callback coffeescript

我无法找到如何创建一个最后调用另一个函数的函数.

我希望能够做到这样的事情:

book.save (err) ->
  MyFunc param1, param2, (callbackParam) ->
    # some code using callbackParam

MyFunc = (param1, param2) ->
  # some other code that defines callbackParam
  ?.call(callbackParam)
Run Code Online (Sandbox Code Playgroud)

需要调用什么以及如何接收数据?

mu *_*ort 17

如果你想打电话给MyFunc:

MyFunc param1, param2, some_function
Run Code Online (Sandbox Code Playgroud)

然后它应该是这样的:

MyFunc = (param1, param2, callback) ->
    # some code that defines callbackParam
    callback callbackParam
Run Code Online (Sandbox Code Playgroud)

如果你想做callback可选的:

MyFunc = (param1, param2, callback) ->
    # some code that defines callbackParam
    callback? callbackParam
Run Code Online (Sandbox Code Playgroud)

如果你想提供一个特定的@(AKA this),那么你在JavaScript中使用call或者apply就像:

MyFunc = (param1, param2, callback) ->
    # some code that defines callbackParam
    callback?.call your_this_object, callbackParam
Run Code Online (Sandbox Code Playgroud)

这些(callbackParam) -> ...东西只是一个函数文字,就像任何其他参数一样,没有像Ruby那样的特殊块处理(你的标签表明Ruby块是你混乱的根源).


Mik*_*any 5

这是一个更干净,更易于阅读和理解的示例:

some_function = (callback) ->
  param1 = "This is param1"
  param2 = "This is param2"
  callback(param1, param2)

callback = (param1, param2) ->
  console.log(param1)
  console.log(param2)

@tester = ->
  some_function(callback)
  "done"
Run Code Online (Sandbox Code Playgroud)

现在加载您的网站,转到控制台,然后调用该函数:

> tester()
  This is param1
  This is param2
< "done"
Run Code Online (Sandbox Code Playgroud)