如何在javascript中处理条件回调同时保持DRY?

时间:2012-06-20 16:33:19

标签: javascript callback

我最近一直在玩NodeJS而且我发现自己陷入了常规模式问题:

我有一个运行的主要操作,根据一些配置参数,我需要执行一个额外的步骤,但这一步是异步的:

    if(request.config.save) {

        fs.writeFile(request.config.save, decryptedData, function(err) {
            // Continue the operation with a callback...
            // Perform some other ops.
            if(typeof callback == 'function') callback(decryptedData);
        }.bind(this));

    } else {

        // Continue the same operation without a callback
        // Perform some other ops.
        if(typeof callback == 'function') callback(decryptedData);

正如您所看到的,此代码不是DRY,因为主要结尾(回调)被调用两次。

我看到的唯一方法就是使用函数(但函数调用再次不是DRY ......代码可能会非常膨胀......

那么有一个很好的忍者技巧来解决这个问题吗?

2 个答案:

答案 0 :(得分:3)

嗯,一行代码并不是重复的,但是如果你做的不止于此,它就会变得非常干燥。将最终的逻辑包装到函数中,然后在条件中调用它会怎么样?

var endTick = function(){
    if(typeof callback == 'function') callback(decryptedData);
}

if(request.config.save) {

    fs.writeFile(request.config.save, decryptedData, function(err) {
        // Continue the operation with a callback...
        // Perform some other ops.
        endTick();
    }.bind(this));

} else {

    // Continue the same operation without a callback
    // Perform some other ops.
    endTick();
}

答案 1 :(得分:0)

function cb() {
   if (typeof arguments[0] === 'function')
      arguments[0].apply(null, Array.prototype.slice.call(arguments,1));
}

不应超过大约10个字符(可能必须bind),而不是正常的函数调用,不用 typeof检查,并假设没有{{1它不应该超过4个。

在没有付出某些代价的情况下,没有办法解决这个问题。