Javascript 如果存在回调,则执行回调(obj),否则返回对象

Javascript 如果存在回调,则执行回调(obj),否则返回对象,javascript,callback,Javascript,Callback,我要做的是将回调参数设置为可选函数。如果传递了回调函数,则将该值发送到回调函数,否则只需返回该值。如果省略回调,则返回未定义的结果 getByUsername = function(user_name, cb){ async.waterfall([ //Acquire SQL connection from pool function(callback){ sql_pool.acquire(function(err, connect

我要做的是将回调参数设置为可选函数。如果传递了回调函数,则将该值发送到回调函数,否则只需返回该值。如果省略回调,则返回未定义的结果

getByUsername = function(user_name, cb){
    async.waterfall([
        //Acquire SQL connection from pool
        function(callback){
            sql_pool.acquire(function(err, connection){
                callback(err, connection);
            });
        },
        //Verify credentials against database
        function(connection, callback){
            var sql = 'SELECT * FROM ?? WHERE ?? = ?';
            var inserts = ['users','user_name', user_name];
            sql = mysql.format(sql,inserts);
            connection.query(sql, function(err, results) {
                sql_pool.release(connection);
                callback(err, results);   
            });
        },
        //Create user object
        function(results, callback) {
            if(results.length < 1){
                if(cb){
                    cb(null);
                } else {
                    return null;
                }
            }else {
                var thisUser = new User(results[0]);
                if(cb){
                    cb(thisUser);
                } else {
                    return thisUser;
                }
            }
        }], function (err, results) {
            throw new Error('errrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrroooooorrrrrrrr');
        }
    )
}
getByUsername=函数(用户名,cb){
异步瀑布([
//从池中获取SQL连接
函数(回调){
sql_pool.acquire(函数(错误、连接){
回调(错误,连接);
});
},
//根据数据库验证凭据
函数(连接、回调){
var sql='从其中选择*=?';
var inserts=['users','user_name',user_name];
sql=mysql.format(sql,inserts);
查询(sql,函数(错误,结果){
sql_池发布(连接);
回调(错误、结果);
});
},
//创建用户对象
函数(结果、回调){
如果(结果长度<1){
如果(cb){
cb(空);
}否则{
返回null;
}
}否则{
var thisUser=新用户(结果[0]);
如果(cb){
cb(该用户);
}否则{
返回此用户;
}
}
}],函数(错误,结果){
抛出新错误('errrrrrrrrrrrrrrrrrrrrrrrrrroooorrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr');
}
)
}

您可以这样检查:

if(cb && typeof cb === "function") {
    cb(num + 1);
}

注意:确保您实际使用的是
cb
调用回调函数,而不是
callback
;)

那问题是什么?哈哈。很抱歉它不能正常工作。我得到了一个没有定义的回调。它应该有点明显。请看参数的名称。另外,如果回调为null,为什么要调用它?drrr。谢谢你,埃文!这很明显。当我纠正错误时,这确实有效。我试图把你从我的实际代码中解救出来(代码要长得多&可能很可怕)。在嗅探上面的示例是否存在类似错误后,我将使用实际代码更新它。:-)将代码更新为我实际使用的代码。我很抱歉,我确信这很明显我是个新手。:-)如果我使用回调,一切都很好。如果我没有通过回调,我将得到未定义。
&&typeof cb==“function”)
如果您想再次检查类型安全性,谢谢zero298。我把它添加到条件中。顺便说一句,不需要
=
,因为
typeof
运算符总是“返回”字符串或null,所以对
“函数”
进行简单的比较就可以了。谢谢!我一定会把这些建议写进我的代码中。我将我的示例更新为我的实际代码,因为我的前一个示例很好,是一个失败(吸取的教训)。在纠正错误后,我能够使前面的示例正常工作,但我无法也不容易看到我的错误。再次感谢
==
==
快,因为
==
会将它与每种类型进行比较。
===
更快、更一致/不太棘手,D.Crockford推荐这种方法,例如,ESLint规则会检查它。但是第一部分是多余的,因为第二部分完成了所有的工作。如果未定义/声明(未定义)
cb
,将抛出
TypeError
。因此,综合解决方案应该使用
try/catch