2016-05-04 4 views
0

Ich habe ein Array enthält etwa 20K Datensätze. Jeder Datensatz enthält eine verschlüsselte Spalte und der Rest nicht. Wenn ich mit Hilfe von for loop durch jeden Datensatz iteriere und die Entschlüsselungs-Callback-Funktion aufruft, kommt das Ergebnis später auf, daher ist der entschlüsselte Wert immer Null. Nach der Entschlüsselung möchte ich die gesamte Zeile in Excel-Tabelle schreiben und die Datei schließen, nachdem jedes Element im Array in die Datei geschrieben wurde. Was ist der beste Weg?Nodejs Iterate durch Array und schreibe in Datei

var myArray = [{name:'ABC',accountNumber:'hsjdhsj%^==='},{name:'BCD',accountNumber:'hsjdhsj%^==='}]; 
for(var i=0; i< myArray.length; i++){ 
    myArray[i].decryptAccNumber = decrypt(myArray[i].accountNumber); // async way to decrypt it 
    res.write(myArray[i]); //Writing to excel file 
} 
res.close(); 

Jetzt enthält die Datei nur Name, Kontonummer, aber nicht entschlüsselte Kontonummer.

Jede beraten, wie man mit einer solchen Forderung gehen, die & async

---------- Edited of sync mischt --------------- ---------

var callbackCount = myArray.length; 
for(var i=0; i< myArray.length; i++) 
{ 
    decrypt(myArray[i].accountNumber,function(decrypted){ 
    myArray[i].decryptAccNumber=decrypted; 
    res.write(myArray[i]); //Writing to excel file 
    callbackCount--; 
    if(callbackCount === 0){ 
     res.close(); 
    } 
    }); 
} 

Dies ist die Lösung bei https://gist.github.com/Grety/236c41acf006475f0eee768b64e4a7bc Auch gegeben, dachte ich, die gleiche Lösung, aber persönlich habe ich diese Lösung nicht wie, wie es um wie Arbeit aussieht. Gibt es einen anderen besseren Weg, dieses Problem als die Verwendung von Temp Variable wie CallbackCounter zu lösen? Das ist das genaue Problem, was ich gepostet habe. Danke an Kyrylo Slatin für die Veröffentlichung der GIT-URL mit genauem Problem.

+0

Try für async.forEach wäre – Subburaj

+0

Sie sollten alle async machen. Es gibt keine Möglichkeit, mehrere Bytes später auf Dateien zu korrigieren. Sie warten, bis die Entschlüsselung abgeschlossen ist. Und wenn es fertig ist (nicht klar, da Sie im Kern keinen Rückruf zum "entschlüsseln" angegeben haben), schreiben Sie in die Datei sowohl entschlüsselte Daten als auch solche, die synchron erhalten wurden –

+0

schreiben Sie eine Rückruffunktion für diese oder entschlüsseln Sie zuerst alle und Schreiben Sie dann in die Datei – Asad

Antwort

0

Übergeben Sie einen Rückruf an Ihre Entschlüsselungsfunktion. Dann können Sie Ihre Zeile schreiben, nachdem die Entschlüsselungsfunktion beendet ist. Here is an example

0

Ihr Problem kann leicht gelöst werden, indem Sie asyn.foreach verwenden. Es wird Ihr decrypt rufen asynchnously für jedes Element im Array und am Ende können Sie Ihre result./

beziehen sich diese https://github.com/caolan/async

0

schreiben Rückruf-Funktion wie diese Hoffnung helfen, es

for(var i=0; i< myArray.length; i++) 
    { 
    decrypt(myArray[i].accountNumber,function(decrypted){ 
    myArray[i].decryptAccNumber=decrypted; 
    res.write(myArray[i]); //Writing to excel file 
    }); 

    } 
    res.close() 

und Ihre derypt Funktion wie diese

decrypt(number,callback){ 
    var decrypted= // you code of decryption 

    callback(decrypted) 
    } 
+0

Wann sollte 'res.close()' in Ihrem Code ausgeführt werden? –

+0

nach der Rückruf-Funktion habe ich @KirillSlatin – Asad

+0

bearbeitet, bevor alle Artikel entschlüsselt werden ... vorausgesetzt, dass "entschlüsseln" wirklich asynchron ist. Also 'for (' wird in einem js-Tick ausgeführt, nach dem Schließen der Datei, und in den nächsten Ticks werden Callbacks aufgerufen, wobei versucht wird, in die gerade geschlossene Datei –