Javascript 函数 return 最佳实践/约定

Javascript function return best practice / convention

说我有这个

if ( ! chargeCreditCard() ) {
    // my custom error message here.
    // would like to display 'err' from
    // chargeCreditCard
    render("Could not charge cc")
} else {
    render("thanks! will ship soon")
}

chargeCreditCard() {
    Library.charge(cc_info, function(err, success) {
        if (err)
            return false

         return true
     }
}

如果我想在 if 语句中显示来自 chargeCreditCard() 的 "err",通常会怎么做?

由于chargeCreditCardreturnstruefalse,我只是向服务器呈现一个基本的"could not charge cc"。

应该从内部 chargeCreditCardreturn err 然后做 像

var result = chargeCreditCard
if ( result !== true) {
    render(result)
} else {
    render('thanks! will ship soon')
}

我想这不是编码问题,而是数据流问题。

在这种情况下更有意义的选项是返回 Promise。 Promises 是封装可能成功也可能不成功的异步操作的完美工具:

chargeCreditCard()
  .then(_ => render("thanks! will ship soon"))
  .catch(err => render(`Could not charge cc. Reason: ${err}`));

chargeCreditCard() {
  return new Promise((resolve, reject) =>
    Library.charge(cc_info, err => err ? reject(err) : resolve())
  );
}

回调传递往往会使代码变得过于复杂,当您开始链接和嵌套代码时更是如此。遗憾的是,promises 是一个相对较新的工具,绝大多数 NodeJS/Javascript 开源代码严重依赖回调传递。

我会选择这样的东西:

function chargeCreditCard(callback) {
  Library.charge(cc_info, callback);
}

chargeCreditCard(function(err, success) {
  if (success) {
    render("thanks! will ship soon");

  } else {
    var errorMsg = "Could not charge cc.";

    if (err)
      errorMsg += " Error: " + err;

    render(errorMsg);
  }
});