2016-07-01 2 views
0

У меня есть блок кода, содержащий, если else и большая часть кода в if и else одинаковы, но из-за одного вызова функции с обратным вызовом я должен иметь совершенно такой же код в оба блока if и else. Я знаю, что для этой цели может быть создана функция, но мне потребуется передать слишком много параметров. Вот код блок:Как избежать дублирования блоков кода в node.js

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"); 
       }); 
      } 
+0

Используйте функцию с параметром. – Bergi

+0

Почему бы вам просто не создать функцию и передать ей ошибки, результаты и токен? – Seonixx

+0

@Seonixx: На самом деле он уже создает эту самую функцию. (дважды). – Bergi

ответ

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 вызов в функцию, но вы должны быть осторожны с прохождением sessionData, self и res (в зависимости от их соответствующего объема).

+1

Возможно, вам потребуется привязать 'self' в зависимости от области, в которую вы положили' validateResponse'. – Bergi

+0

Вы правы, но это зависит от остальной части кода. Я отредактирую ответ, спасибо! – miquelarranz

0

Вы можете использовать асинхронный модуль, чтобы вам не нужно было повторять эту функцию.

+0

Можете ли вы указать, где именно я должен искать в асинхронной документации: http://caolan.github.io/async/docs.html? Я не уверен, что следует искать в документах. –

+0

Устанавливает npm --save async, затем требуется модуль в файле вашего сервера. После этого следуйте по ссылке [http://www.hacksparrow.com/node-js-async-programming.html). – Garima