我正在使用一个API包装器,其端点在查询时只接受用户ID - 但是,有一个端点允许我按用户名搜索(包装器,searchByUsername,你将在下面看到)我写了跟随帮助函数在每个请求触发之前转换它们,为我们的用户提供灵活性:
var convertToID = function (username, callback) {
searchByUsername(username, function (error, response, body) {
if (body.users[0]){
callback(body.users[0].username)
}
})
};
以下是我使用它的方式:
this.relationship = function (user, query, callback) {
if (isNaN(user)) {
convertToID(user, function (ID) {
get('/users/' + ID + '/relationships/?query=' + query, callback);
})
} else {
get('/users/' + user + '/relationships/?query=' + query, callback);
}
}
这很好用,但将它放入我的每个包装器中显然是次优的。来自Ruby背景,我可以把它压缩成一行 - 但JS的异步性质有点扭曲我的大脑。我真正想要的是类似于:
var user = isNaN(user) ? convertUsernameToID(user) : user;
get('/users/' + user + '/relationships/?query='+query, callback);
我已经探索了其他答案(是的,我知道它们中有很多)re:async JS gotchas,但我必须遗漏一些东西。在过去的较大型项目中,我使用过异步软件包,但感觉有点过分了,我更喜欢这个。
答案 0 :(得分:0)
您可以使用
function relationship(user, query, callback) {
if (isNaN(user))
convertToID(user, getById);
else
getById(user);
function getById(ID) {
get('/users/' + ID + '/relationships/?query=' + query, callback);
}
}
如果您使用的是承诺,则变得更加简单,请参阅if-else flow in promise (bluebird)。