Javascript函数返回最佳实践/约定

时间:2017-09-28 04:43:08

标签: javascript parameter-passing conventions

说我有这个

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
     }
}

如果我想展示"错误"通常会做什么?来自chargeCreditCard()声明中的if

由于chargeCreditCard返回truefalse,我只是向服务器呈现一个基本的"无法收取cc"。

应该从return err内部进行chargeCreditCard然后执行

之类的东西
var result = chargeCreditCard
if ( result !== true) {
    render(result)
} else {
    render('thanks! will ship soon')
}

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

2 个答案:

答案 0 :(得分:0)

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

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开源代码都严重依赖于回调传递。

答案 1 :(得分:0)

我会选择这样的事情:

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);
  }
});