如何避免node.js中重复的代码块

时间:2016-07-01 09:55:30

标签: javascript node.js express callback

我有一个代码块,其中包含if else和if和else中的大多数代码是相同的,但由于一个函数调用回调,我必须在if和else块中使用完全相同的代码。我知道可以为此目的创建一个函数,但它需要我传递太多的参数。这是代码块:

if (results[0].register_type == 'D') {
                sessionData.register_type = results[0].register_type;
                UserModel.updategcm_id(req.body, function (err, result) {
                    UserSessionModel.createSessionToken(sessionData, function (err, result, token) {
                        if (err) {
                            res.status(400).send(self.createResponse({}, {
                                success: false,
                                message: err.message
                            }));
                            return false;
                        }
                        res.status(200).send(self.createResponse({
                            token: token,
                            userid: results[0].id
                        }, {
                                success: true,
                                message: "User has logged in successfully"
                            }));
                        console.log("User has logged in successfully...\n");
                    });
                });
            } else {
                UserSessionModel.createSessionToken(sessionData, function (err, result, token) {
                    if (err) {
                        res.status(400).send(self.createResponse({}, {
                            success: false,
                            message: err.message
                        }));
                        return false;
                    }
                    res.status(200).send(self.createResponse({
                        token: token,
                        userid: results[0].id
                    }, {
                            success: true,
                            message: "User has logged in successfully"
                        }));
                    console.log("User has logged in successfully...\n");
                });
            }

2 个答案:

答案 0 :(得分:0)

我认为最好的解决方案是将重复的函数移动到函数声明中,然后将其作为回调传递。您的代码将更改为:

if (results[0].register_type == 'D') {
    sessionData.register_type = results[0].register_type;
    UserModel.updategcm_id(req.body, function (err, result) {
        UserSessionModel.createSessionToken(sessionData, validateResponse);
    });
} else {
    UserSessionModel.createSessionToken(sessionData, validateResponse);
}

function validateResponse(err, result, token) {
    if (err) {
        res.status(400).send(self.createResponse({}, {
            success: false,
            message: err.message
        }));
        return false;
    }
    res.status(200).send(self.createResponse({
        token: token,
        userid: results[0].id
    }, {
        success: true,
        message: "User has logged in successfully"
    }));
    console.log("User has logged in successfully...\n");
}

现在代码更干净了。

您还可以将整个createSessionToken调用分解为函数,但是您必须小心传递sessionDataselfres(取决于各自的范围。)

答案 1 :(得分:0)

您可以使用异步模块,这样就不需要重复该功能了。