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",通常会怎么做?
由于chargeCreditCard
returnstrue
或false
,我只是向服务器呈现一个基本的"could not charge cc"。
应该从内部 chargeCreditCard
做 return 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);
}
});
说我有这个
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",通常会怎么做?
由于chargeCreditCard
returnstrue
或false
,我只是向服务器呈现一个基本的"could not charge cc"。
应该从内部 chargeCreditCard
做 return 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);
}
});