重构 JavaScript 中的嵌套 if 语句
Refactoring nested if statements in JavaScript
我有一长串嵌套的 if 语句。我写的代码工作正常,但非常笨拙。有没有更简单的写法?
couchdb.query(phoneParam, function(err, data) {
if (err) {
console.log(err, err.stack);
} else if (data.Items.length > 0) {
deferred.resolve(data.Items[0]);
} else {
couchdb.query(phone1Param, function(err, data) {
if (err) {
console.log(err, err.stack);
} else if (data.Items.length > 0) {
deferred.resolve(data.Items[0]);
} else {
couchdb.query(phone2Param, function(err, data) {
if (err) {
console.log(err, err.stack);
} else if (data.Items.length > 0) {
deferred.resolve(data.Items[0]);
} else {
...
}
});
}
});
}
});
您可以通过编写一个回调函数来替换嵌套条件,如果查询没有产生有趣的结果,该回调函数将自身传递给 couchdb.query
。要使新查询使用下一个 phone 参数,请将充当索引的变量递增到 phone 参数数组中。
下面的代码在逻辑上等同于你上面写的。
// Put all of your phone parameters into an array.
var phoneParams = [phoneParam, phone1Param, phone2Param, phone3Param];
// Use pos to track the array position of the current parameter.
var pos = 0;
function callback(err, data) {
if (err) {
console.log(err, err.stack);
} else if (data.Items.length > 0) {
deferred.resolve(data.Items[0]);
} else if (++pos < phoneParams.length) { // Increment the array position.
couchdb.query(phoneParams[pos], callback); // Recursive use of callback.
}
}
// Kick off the series of calls.
couchdb.query(phoneParams[pos], callback);
之后检查 pos
的值可能是个好主意。如果它等于 phoneParams.length
,您就知道 phone 参数中的 none 已淘汰,您可以对此采取一些措施。你会将这段代码放在哪里?您不能在初始调用 couchdb.query
之后插入它,因为它是异步的,您不知道最终回调何时完成。
解决方案是在另一个函数中继续您的代码。您可以在退出 callback
时调用该函数而无需递归。例如,如果包含清理代码的函数调用 finish
,则可以修改 callback
为:
function callback(err, data) {
if (err) { // Print error and finish.
console.log(err, err.stack);
finish();
} else if (data.Items.length > 0) { // Use data and finish.
deferred.resolve(data.Items[0]);
finish();
} else if (++pos < phoneParams.length) { // Don't finish -- recurse.
couchdb.query(phoneParams[pos], callback);
} else {
finish(); // No choice but to finish.
}
}
我有一长串嵌套的 if 语句。我写的代码工作正常,但非常笨拙。有没有更简单的写法?
couchdb.query(phoneParam, function(err, data) {
if (err) {
console.log(err, err.stack);
} else if (data.Items.length > 0) {
deferred.resolve(data.Items[0]);
} else {
couchdb.query(phone1Param, function(err, data) {
if (err) {
console.log(err, err.stack);
} else if (data.Items.length > 0) {
deferred.resolve(data.Items[0]);
} else {
couchdb.query(phone2Param, function(err, data) {
if (err) {
console.log(err, err.stack);
} else if (data.Items.length > 0) {
deferred.resolve(data.Items[0]);
} else {
...
}
});
}
});
}
});
您可以通过编写一个回调函数来替换嵌套条件,如果查询没有产生有趣的结果,该回调函数将自身传递给 couchdb.query
。要使新查询使用下一个 phone 参数,请将充当索引的变量递增到 phone 参数数组中。
下面的代码在逻辑上等同于你上面写的。
// Put all of your phone parameters into an array.
var phoneParams = [phoneParam, phone1Param, phone2Param, phone3Param];
// Use pos to track the array position of the current parameter.
var pos = 0;
function callback(err, data) {
if (err) {
console.log(err, err.stack);
} else if (data.Items.length > 0) {
deferred.resolve(data.Items[0]);
} else if (++pos < phoneParams.length) { // Increment the array position.
couchdb.query(phoneParams[pos], callback); // Recursive use of callback.
}
}
// Kick off the series of calls.
couchdb.query(phoneParams[pos], callback);
之后检查 pos
的值可能是个好主意。如果它等于 phoneParams.length
,您就知道 phone 参数中的 none 已淘汰,您可以对此采取一些措施。你会将这段代码放在哪里?您不能在初始调用 couchdb.query
之后插入它,因为它是异步的,您不知道最终回调何时完成。
解决方案是在另一个函数中继续您的代码。您可以在退出 callback
时调用该函数而无需递归。例如,如果包含清理代码的函数调用 finish
,则可以修改 callback
为:
function callback(err, data) {
if (err) { // Print error and finish.
console.log(err, err.stack);
finish();
} else if (data.Items.length > 0) { // Use data and finish.
deferred.resolve(data.Items[0]);
finish();
} else if (++pos < phoneParams.length) { // Don't finish -- recurse.
couchdb.query(phoneParams[pos], callback);
} else {
finish(); // No choice but to finish.
}
}