我在CoffeeScript类中有以下功能:
use: (db, fn) ->
fs.exists db, (exists) =>
if exists?
@db = db
@_fetch()
else
fs.writeFile db, {}, (err) =>
if err
err
else
@db = db
@_fetch()
困扰我的是我必须两次写@db = db
和@_fetch()
。我必须这样做的原因是else
子句调用fs.writeFile
这是异步的。因此,我必须将这两行放在writeFile
的回调中,以确保它们不会过早发射。
然而,有没有办法清理它并写下那些线?目前只有 两行,但如果回调存在10行怎么办?会变得凌乱,不是吗?
对这一小段代码的任何其他反馈也是受欢迎的。不确定错误处理(目前只返回err
..)。
答案 0 :(得分:1)
CoffeeScript具有函数,=>
允许您将函数绑定到实例,那么为什么不将代码切换到绑定函数中呢?
use: (db, fn) ->
fetch = =>
@db = db
@_fetch()
fs.exists db, (exists) =>
if exists?
fetch()
else
fs.writeFile db, {}, (err) =>
if err
err
else
fetch()
然后向fn
添加其他任何内容(例如调用fetch
)。
另外,我不认为你的:
if err
err
错误处理可以做任何事情。我不是node.js专家,但是,AFAIK,writeFile
并不关心回调的回归。
答案 1 :(得分:1)
您可以引入帮助函数:
use: (db, fn) ->
helper = () =>
@db = db
@_fetch()
…
fn(null, result)
fs.exists db, (exists) =>
if exists
helper()
else
fs.writeFile db, {}, (err) ->
if err
fn(err)
else
helper()
return
return
答案 2 :(得分:0)
由于唯一一次你不想加载数据库并且获取是因为db不存在并且后续加载会产生错误,你可以尝试这样的事情......
use: (db, fn) ->
fs.exists db, (exists) =>
if not exists?
fs.writeFile db, {}, (err) =>
if err
return err
@db = db
@_fetch()