Coffeescript 带有多个回调的冰咖啡脚本
当我刷新多个数据源时,我正在将Iced coffescript与upshot js一起使用。refresh方法有两个回调,一个是成功回调,一个是错误回调,我想等待每个回调都进行 我看不出如何在没有附加函数的情况下使用idced coffescript实现这一点。我的问题是-有没有一种更优雅的方式可以让我遵从多个回调中的一个 这是我目前拥有的代码:Coffeescript 带有多个回调的冰咖啡脚本,coffeescript,iced-coffeescript,Coffeescript,Iced Coffeescript,当我刷新多个数据源时,我正在将Iced coffescript与upshot js一起使用。refresh方法有两个回调,一个是成功回调,一个是错误回调,我想等待每个回调都进行 我看不出如何在没有附加函数的情况下使用idced coffescript实现这一点。我的问题是-有没有一种更优雅的方式可以让我遵从多个回调中的一个 这是我目前拥有的代码: refreshMe = (key, value, result) => value.refresh( (success)=>
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]}"
这就是我要做的,虽然也可以(但更复杂)分配一个新的会合点,从该会合点创建两个延迟,然后只等待第一个返回。