10

複数のデータソースを更新するときに、upshotjsでIcedcoffescriptを使用しています。refreshメソッドには、成功の場合とエラーの場合の2つのコールバックがあります。各呼び出しがいずれかのコールバックを行うのを待ちたいと思います。

追加の関数を作成せずにidcedcoffescriptでこれを行う方法を理解することはできません。私の質問は-複数のコールバックの1つに延期できるよりエレガントな方法はありますか?

これは私が現在持っているコードです:

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]
4

3 に答える 3

5

これは私がそれをするために見つけた唯一の方法です。私はこれをバックボーンで使用しており、(たとえば)モデルの@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)
于 2012-05-09T11:15:41.530 に答える
1

Promises.then (-> 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コールバックごとに複数の引数を処理することができます。

于 2013-06-19T17:47:54.387 に答える
0

iced.Rendezvous libは、この場合に明示的に作成されます。複数のコールバックの最初に戻ります。ドキュメントから:

これは、ランデブーのさまざまな入力と出力を示す例です。2つの並列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]}"
于 2015-02-04T17:59:36.113 に答える