在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
。要使新的查询使用下一个电话参数,请增加一个变量,该变量作为电话参数数组的索引。
下面的代码在逻辑上等同于上面的代码。
// 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
,你知道手机参数都没有成功,你可以做些什么。你会把代码放在哪里?你不能只是在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.
}
}
相关文章:
- 可以't让我的if语句处理js中的html表单输入
- 如何在 API 调用后和 if 语句中启用提交按钮
- 带有多个elseif的Javascript if语句
- Sharepoint JScript if语句未执行
- for循环中的javascript if语句找不到==
- jquery if语句返回return wong语句
- 在if语句下的html中使用javascript变量
- 将错误与if语句混淆
- 循环通过数组的If语句不起作用
- jQuery模板中的If语句
- 如何从数据库中回显If语句
- 如何减少if语句的数量
- 在Javascript中将一个值和字符串数组转换为if语句
- Dropbox oauth认证的IF语句的第二部分是't已触发
- MVC Jquery-按钮点击-获取if语句错误
- 如何重写Javascript If语句以选择Classes而不是ID's的HTML格式
- KnockoutJS:为虚拟元素使用嵌套的条件if语句
- If语句发布或操作员发布
- 清除函数中if语句内部不起作用的间隔
- 使用if语句重新循环