3

アイスコーヒースクリプトで「使いすぎの延期」警告はどういう意味ですか?コードでキャッチされていないエラーをスローすると発生するようです。ユニットテストでキャッチされないエラーである必要があるので、どうすればエラーをバブルアップさせることができますか。たとえば、getByNameメソッドがエラーをスローした場合、例外をバブリングするのではなく、アイスコーヒースクリプトの警告をバブリングします。

await Profile.getByName p.uname, defer(err, existingUser)
return done new errors.DuplicateUserName(), 409 if existingUser isnt null
return done new Error("error in looking up user name " + err), 500 if err
4

2 に答える 2

4

このエラーは、によって生成されたコールバックdeferが複数回呼び出された場合に生成されます。あなたの場合、それはProfile.getByNameそのコールバックを2回(またはそれ以上)呼び出している可能性があります。この警告は、ほとんどの場合、私の経験に誤りがあることを示しています。

Rendezvousからコールバックを作成し、それを明示的に「マルチ」コールバックにする場合は、この警告を無効にできます。deferそれ以外の場合は、からのリターンでワンショットコールバックを提供することだけが理にかなっています。

詳細はこちら:https ://github.com/maxtaco/coffee-script/blob/iced/iced.md#icedrendezvousidimultidefer-slots

用語に関する小さな注意:IcedCoffeeScriptでは、によって生成されたコールバックはdefer、エラーメッセージとドキュメントでは「延期」と呼ばれます。

于 2013-01-15T21:13:44.247 に答える
1

Maxの答えに加えて、継続スタイルプログラミングの適切な使用法は、反復コールバックではなく、1回限りのコールバックを置き換えることです。すべてawaitの延期が完了するのを待って、先に進むことができます。node.jsのモジュールを使用して大きなファイルを読み取る次の例fsでは、このエラーが再現されます。

toread = process.argv[2]
fs = require 'fs'
rs = fs.createReadStream toread
await rs.on 'data', defer content
console.log "content: #{content}"

次に、このスクリプトを巨大なテキストファイルで実行します。data大きなファイルのコンテンツがバッファに収まらないため、イベントは複数回発生するため、生成された遅延コールバックに対して複数回発生し、同じエラーが発生します。

<partial file contents...>
ICED warning: overused deferral at <anonymous> (C:\Users\kk\3.coffee:4)
ICED warning: overused deferral at <anonymous> (C:\Users\kk\3.coffee:4)
ICED warning: overused deferral at <anonymous> (C:\Users\kk\3.coffee:4)
...

この場合、は完全ではないので使用するのは間違ってawait/defercontentます。これがまさに、Maxがこのエラーの存在が通常コードのバグを示していると述べた理由です。実際、IMOは、沈黙させることができる警告ではなく、エラーをスローする必要があります。

于 2014-08-30T10:43:58.490 に答える