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两次(或更多)调用其回调。这个警告几乎总是表明我的经验有错误。

如果您从 Rendezvous 创建回调并明确将其设为“多”回调,则可以禁用此警告。否则,只有让 return fromdefer给你一个一次性回调才有意义。

更多信息在这里:https ://github.com/maxtaco/coffee-script/blob/iced/iced.md#icedrendezvousidimultidefer-slots

关于术语的一点说明:在 IcedCoffeeScript 中,生成的回调defer在错误消息和文档中称为“延迟”。

于 2013-01-15T21:13:44.247 回答
1

在 Max 的回答之上,延续样式编程的适当用法应该是替换一次性回调,而不是重复回调。所做的只是等待其所有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/defer的。content这正是 Max 提到此错误的存在通常表示代码错误的原因。事实上,IMO 它应该抛出一个错误,而不是一个可以静音的警告。

于 2014-08-30T10:43:58.490 回答