2016-07-01 36 views
0

Ich habe einen Codeblock, der wenn sonst und der meiste Code in if und anderen gleich ist, aber aufgrund eines Funktionsaufrufs mit Rückruf, muss ich ziemlich einen gleichen Code in sowohl wenn als auch sonst blockieren. Ich weiß, dass eine Funktion für diesen Zweck erstellt werden kann, aber ich muss zu viele Parameter übergeben. Hier ist der Code-Block:Wie doppelte Codeblöcke in node.js zu vermeiden

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

Verwenden Sie eine Funktion mit einem Parameter. – Bergi

+0

Warum erstellen Sie nicht einfach eine Funktion und übergeben Sie Fehler, Ergebnisse und Token dazu? – Seonixx

+0

@Seonixx: Eigentlich schafft er schon genau diese Funktion. (zweimal). – Bergi

Antwort

0

Ich denke, dass die beste Lösung ist, die wiederholte Funktion auf eine Funktionsdeklaration zu bewegen und es nur als Callback übergeben. Ihr Code würde sich ändern in:

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

Der Code ist jetzt viel sauberer.

Sie können auch den ganzen createSessionToken Anruf in eine Funktion ausklammern, aber Sie würden mit geben sessionData vorsichtig sein, self und res (abhängig vom jeweiligen Umfang).

+1

Je nach dem Umfang, in den Sie 'validateResponse' setzen, müssen Sie möglicherweise 'self' binden. – Bergi

+0

Sie haben Recht, aber es hängt vom Rest des Codes ab. Ich werde die Antwort bearbeiten, danke! – miquelarranz

0

Sie können das Async-Modul verwenden, so dass Sie die Funktion nicht wiederholen müssen.

+0

Können Sie darauf hinweisen, wo genau ich in der asynchronen Dokumentation suchen sollte: http://caolan.github.io/async/docs.html? Ich bin mir nicht sicher, was ich in den Dokumenten suchen soll. –

+0

Do npm installieren --save async, dann benötigen Sie das Modul in Ihrer Server-Datei. Danach folgen Sie der [link] (http://www.hacksparrow.com/node-js-async-programming.html). – Garima

Verwandte Themen