我使用csv-parse进行流解析。对于每条记录,我需要调用一些函数mapper.process()
。由于后一个函数返回一个promise,因此用co
和前缀yield
包装它。
parser.on('readable', function() {
var record;
while (record = parser.read()) {
return co(function*() {
yield mapper.process(record);
});
}
});
没有添加(删除第4,6和yield
行),一切正常。但是,使用如上所示的解析器,吞下了抛出的错误。
如何解决这个问题?
答案 0 :(得分:2)
这里的问题是任何抛出的错误都会消失,因为在co函数之后没有catch处理程序。
但更重要的是,while循环中的return语句将导致整个函数返回,因此如果缓冲区中有多条记录,则无法访问它们。
您可以编写以下代码以使其正常工作:
class Basket(model.Models):
pass
@classmethod
def item_added(self, **kargs):
print karts['instance']
class Item(models.Model):
basket = models.ForeignKey(Basket, related_name='items')
post_save.connect(Basket.item_added, sender=Item)
但是,请注意,因为您在“可读”回调中处理异步代码,所以您将导致功能立即返回。此行为将导致“ finish ”事件由流末尾的解析器调用,并且可能 之前您实际已完成数据处理。