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