2016-11-13 12 views
3

Ich möchte die gleiche Funktion dreimal mit Javascript Versprechungen ausführen. Bei jedem Aufruf der Funktion wird eine Textdatei Zeile für Zeile gelesen und die Antwort für jede Zeile in eine andere Textdatei geschrieben. Ich möchte Javascript versprechen, bis die vorherige Funktion fertig ist, aber aus irgendeinem Grund führt es einfach die drei Funktionen gleichzeitig aus und schreibt dabei gleichzeitig auf drei Dateien. Da ich eine riesige Datei bearbeite, dauert das Schreiben in drei Textdateien sehr lange.Wie kann ich die gleiche Funktion mit Javascript Versprechen ausführen?

Kann mir bitte jemand helfen, herauszufinden, wie man das richtig macht? Ich bin neu bei Promises und brauche all die Hilfe, die ich bekommen kann.

Hier ist mein Code:

function verifyTransactions(fileName,functionName,obj,depth){ 
    var rd = readline.createInterface({ 
     input: fs.createReadStream('../paymo_input/stream_payment.csv'), 
     output: process.stdout, 
     terminal: false 
    }); 
    rd.on('line', function(line) { 
     var userData = extractUserData(line) 
     if (userData !== undefined){ 
     var id1 = userData[0], id2 = userData[1]; 
     if (obj[id1]){ 
      console.log(id1) 
      fs.appendFileSync('../paymo_output/'+fileName  +'.txt',functionName(obj,id1,id2,depth)+"\n", "UTF-8",{'flags': 'a'}); 
     } 
     else{ 
      console.log("nope") 
      fs.appendFileSync('../paymo_output/'+fileName+'.txt', "unverified"+"\n", "UTF-8",{'flags': 'a'}); 
     } 
     } 
    }); 
    rd.on('end',function(){ 
     console.log("ON TO THE NEXXTTTTT") 
    }) 
} 

Promise.resolve("output1") 
    .then(function(file){ 
    verifyTransactions(file,pastTransaction,userTransactions); 
    console.log("WRITING TO FILE TWO SOON") 
    return "output2";}) 
    .then(function(file){ 
    verifyTransactions(file,breadthFirstSearch,userTransactions,2); 
    return "output3";}) 
    .then(function(file){ 
    verifyTransactions(file,breadthFirstSearch,userTransactions,4); 
    return "FINITO!!!";}) 
    .then(function(file){ 
    console.log(file); 
    }) 

Antwort

2

wenn Sie Promises verwenden warten soll, bis eine Funktion seine Arbeit beendet hat, müssen Sie drei Dinge tun:

  1. Rückkehr eine ungelöste Versprechen Objekt von dieser Funktion
  2. innerhalb dieser Funktion, lösen Sie die Versprechen, sobald Sie entscheiden, die Funktion hat seinen Job
  3. wo immer Sie diese Funktion aufrufen, müssen Sie wa es für sein Versprechen zu lösen, bevor er mehr Dinge tut. Das ist mit erreicht.

mit anderen Worten:

function myFunction(input) { 
    var promise = new Promise(); 

    /* do some things, then: */ 
    someEventEmitter.on('myEvent', function() { 
    promise.resolve(returnValue); // all done! 
    }); 

    return promise; 
} 

myFunction(input1) 
    .then((function(result) { // run this function once the Promise has resolved 
    console.log('myFunction returned: ' + result); 
    }); 

wenn Sie Promises verwenden zu tun mehrere asynchrone Dinge in Folge wollen, müssen Sie tun, was Versprechen Chaining genannt:

myFunction(input1) // returns a Promise, which has a .then() method 
    .then(function(result) { 
    console.log('first result: ' + result); 
    return myFunction(input2); // return a new Promise from inside of the function passed to .then() 
    }) // this new Promise has a .then() method of its own 
    .then(function(result2) { 
    console.log('second result: ' + result2); 
    return myFunction(input3); 
    }) 
    .then(function(result3) { 
    console.log('third result: ' + result3); 
    }); 
+1

Ich habe versucht, was du vorgeschlagen hast, aber nur die erste Funktion läuft. Muss ich provide.resolve (returnvalue) haben? Kann der Rückgabewert etwas wie "Fertig" sein? – CatherineAlv

+1

Dan danke für Ihre Hilfe! Ich habe die oben vorgeschlagenen Änderungen vorgenommen. Ich erkannte auch, dass mein Hauptproblem darin bestand, dass resolve() nie zurückgegeben wurde, da rd.on ('end' ... nicht existierte. Es sollte rd.on sein ('close', ...) – CatherineAlv

Verwandte Themen