Coffeescript 带有多个回调的冰咖啡脚本

Coffeescript 带有多个回调的冰咖啡脚本,coffeescript,iced-coffeescript,Coffeescript,Iced Coffeescript,当我刷新多个数据源时,我正在将Iced coffescript与upshot js一起使用。refresh方法有两个回调,一个是成功回调,一个是错误回调,我想等待每个回调都进行 我看不出如何在没有附加函数的情况下使用idced coffescript实现这一点。我的问题是-有没有一种更优雅的方式可以让我遵从多个回调中的一个 这是我目前拥有的代码: refreshMe = (key, value, result) => value.refresh( (success)=>

当我刷新多个数据源时,我正在将Iced coffescript与upshot js一起使用。refresh方法有两个回调,一个是成功回调,一个是错误回调,我想等待每个回调都进行

我看不出如何在没有附加函数的情况下使用idced coffescript实现这一点。我的问题是-有没有一种更优雅的方式可以让我遵从多个回调中的一个

这是我目前拥有的代码:

refreshMe = (key, value, result) =>
    value.refresh(
    (success)=>
            result success
    ,
    (fail, reason, error)=>
        result undefined, fail
    )
@refresh = () =>                
success={}
fail={}
await
    for key, value of @dataSources
    refreshMe key, value, defer success[key], fail[key]

这也是我找到的唯一方法。我在主干中使用它,并将(例如)模型的@save函数包装为@icedSave:

# An IcedCoffeescript friendly version of save
icedSave: (callback) ->
    @save {},
        success: (model, response) -> callback(true, model, response)
        error: (model, response) -> callback(false, model, response)

下面是一些我用来将承诺转换为承诺的代码。然后(->onSuccess),(->onError)转换为errbacks
(err,result)->

# You can write like this:
await value.refresh esc defer e, result


# onError - function to be called when promise rejected.
# onSuccess - function to be called when promise is fulfilled.
module.exports = esc = (onError, onSuccess) ->
  util = require 'util'
  return (result) ->
    if util.isError result
      # Always send back an error to first handler.
      onError? result
    else if onSuccess?
      console.log onSuccess, result
      # `await fn esc done, defer result`
      onSuccess? result
    else
      # `await fn esc done`
      onError? null, result
您可以稍微修改
esc
函数,以处理每个回调的多个参数。

lib是针对这种情况显式创建的:在多个回调的第一个回调时返回。发件人:

下面是一个示例,展示了 会合地点。它执行两个并行DNS查找,并且仅在 第一个返回:

hosts = [ "okcupid.com", "google.com" ];
ips = errs = []
rv = new iced.Rendezvous
for h,i in hosts
    dns.resolve hosts[i], rv.id(i).defer errs[i], ips[i]

await rv.wait defer which
console.log "#{hosts[which]}  -> #{ips[which]}"

这就是我要做的,虽然也可以(但更复杂)分配一个新的会合点,从该会合点创建两个延迟,然后只等待第一个返回。