如何编写在Javascript上使用或不使用回调函数的函数?

时间:2014-09-10 11:02:41

标签: javascript node.js

我想知道如何(如果可能的话)我可以创建相同的功能,具有完全相同的功能,但是要与回调一起使用或不使用它。以下是"想要的效果"那是行不通的:

function getUsers(req, res, onComplete) {
    // If the user is not logged in send an error. In other case, send data
    if (!req.session.session_id) {
        if (typeof onComplete === 'function') {
            onComplete({error: true, msg: 'You are not logged in'});
        } else {
            res.json({error: true, msg: 'You are not logged in'});
        }  
    } else {
        //Another similar code...
    }
}

它没有工作,因为如果我打电话给#34; getUsers(req,res)&#34;,onComplete的typeof总是起作用,所以无论是否使用回调我都无法检测到。< / p>

确切的问题是我可以在我的代码中调用此函数,使用回调(正常调用,如getUsers(req, res, function(cb) {//Do something with cb});或者我可以通过我的网站中的AJAX调用调用此函数,如{{1}在那种情况下,什么时候它不起作用。

在最后一种情况下,我得到http://localhost:8080/api/getUsers为真,所以我永远不会执行其他部分。我假设&#34;请求&#34;由http调用完成的参数比req&amp; res更多,这就是为什么onComplete是一个函数而不是未定义的原因。

通常的AJAX调用是这样的(客户端的javascript):

typeof onComplete === 'function'

我的Node.JS的config.json中定义的调用最终函数的路径是这样的:

function getAllUsers() {
    $.ajax({
        url: '/api/getUsers',
        type: 'GET',
        success: function(data) {
            // Remove item and set as main topic the assigned on the server 
            printUsers(data.users[0]);
        },
        error: function(XMLHttpRequest, textStatus, errorThrown) { 
            alert(XMLHttpRequest.responseText); 
        } 
    });
}

1 个答案:

答案 0 :(得分:3)

如果在没有onComplete的情况下调用getUsers,则该值将设置为undefined。然后,您可以在函数中检查该案例。

function getUsers(req, res, onComplete) {
    // Set onComplete to default call back if it is undefined
    onComplete = onComplete || function(msg){ res.json(msg) };

    if (!req.session.session_id) {
        onComplete({error: true, msg: 'You are not logged in'});  
    } else {
        //Another similar code...
    }
}

有关更多方法,请参阅http://www.markhansen.co.nz/javascript-optional-parameters/