避免在咖啡脚本中自动生成 returns

avoiding auto generated returns in coffee script

如何去除咖啡脚本中自动生成的 returns:

createHash = (password) ->
  bcrypt.genSalt 10, (err, salt) ->
    bcrypt.hash password, salt, (err, hash) ->
      hash

我越来越...

createHash = function(password) {
  return bcrypt.genSalt(10, function(err, salt) {
    return bcrypt.hash(password, salt, function(err, hash) {
      return hash;
    });
  });
};

...但我想要一个没有 returns:

的解决方案
createHash = function(password) {
  bcrypt.genSalt(10, function(err, salt) {
    bcrypt.hash(password, salt, function(err, hash) {
      return hash;
    });
  });
};

我如何完成这项工作?

默认情况下,CoffeeScript 函数 return 它们最后一个表达式的值,因此:

f = ->
    # Bunch of interesting things...
    6

相当于:

f = ->
    # Bunch of interesting things...
    return 6

因此 return 出现在转译的 JavaScript 中。

在 JavaScript 中,没有显式 return 的函数隐式 returns undefined 所以这些 return 是一样的:

function() { }
function() { return }
function() { return undefined }

把这两件事放在一起给你两个选择:

  1. 在你的函数底部抛出一个 undefined 来绕过隐式的 return 和一个显式的

    createHash = (password) ->
      bcrypt.genSalt 10, (err, salt) ->
        bcrypt.hash password, salt, (err, hash) ->
          hash
        undefined
      undefined
    
  2. 或者更好的是,明确表明您 return 没有空 return:

    createHash = (password) ->
      bcrypt.genSalt 10, (err, salt) ->
        bcrypt.hash password, salt, (err, hash) ->
          hash
        return
      return
    

第二个选项应该会为您提供您正在寻找的JavaScript:

var createHash;
createHash = function(password) {
  bcrypt.genSalt(10, function(err, salt) {
    bcrypt.hash(password, salt, function(err, hash) {
      return hash;
    });
  });
};