为什么冰咖啡会发出警告:当抛出异常时过度使用推迟

时间:2012-11-27 22:44:05

标签: iced-coffeescript

过度使用的推迟警告在冰咖啡中意味着什么?当我在代码中抛出未被捕获的错误时,似乎会发生这种情况。我怎么能让错误冒出来,因为我需要它是单元测试的未被捕获的错误。例如,如果我的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

2 个答案:

答案 0 :(得分:4)

defer生成的回调被多次调用时,会生成此错误。在您的情况下,可能是Profile.getByName正在调用其回调两次(或更多次)。这个警告几乎总是表明我的经历有误。

如果从Rendezvous创建回调并明确地将其设置为“多”回调,则可以禁用此警告。否则,只有从defer返回给你一次回调才有意义。

此处有更多信息:https://github.com/maxtaco/coffee-script/blob/iced/iced.md#icedrendezvousidimultidefer-slots

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

答案 1 :(得分:1)

除了Max的答案之外,延续样式编程的适当用法应该是替换一次性回调,而不是重复回调。所有await所做的就是等待所有延期完成,以便继续前进。以下使用node.js的{​​{1}}模块读取大文件的示例将重现此错误:

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将无法完成。这正是Max提到此错误的存在通常表示代码错误的原因。实际上IMO应该抛出一个错误,而不是一个可以沉默的警告。