2017-11-16 4 views
0

Ich habe versucht, dem asynchronen Wasserfallbeispiel zu folgen, das unten gezeigt wird;Nodejs Redis und Waterfall übergeben Wert nicht zur nächsten Funktion

async.waterfall([ 
    function(callback) { 
     callback(null, 'one', 'two'); 
    }, 
    function(arg1, arg2, callback) { 
     // arg1 now equals 'one' and arg2 now equals 'two' 
     callback(null, 'three'); 
    }, 
    function(arg1, callback) { 
     // arg1 now equals 'three' 
     callback(null, 'done'); 
    } 
], function (err, result) { 
    // result now equals 'done' 
}); 

Hier ist meine Version des Codes;

var successfulRecords = 0 //successfulRecords holds the number of successfully processed rows 

     //Delete existing records for prepaid model before adding new records 
     async.waterfall([ 
      function(callback){ 
       redis.del("prepaid",function(err,data){ 
        if (err){ 
         logger.debug(err); 
        } 

        SCORES_CACHE = new Map(
         rows.map(function(row){ 
          redis.zadd("prepaid",row[1],row[0],function(err,response){ 

           if (err){ 
            logger.debug(err); 
           } 

           if (response==1){ 
            successfulRecords=successfulRecords+1; 
            console.log(successfulRecords); 
           } 
          }) 
         }) 
         ) 

       }) 
       callback(null,successfulRecords); 
      }, 

      function(arg1,callback){ 
       console.log('hello, waiting for arg1: ',arg1); 
      } 
      ], function(err,result){ 

      }); 

-Code sollte wie dieses

arbeiten
  1. Datensatz einfügen in redis DB
  2. Wenn erfolgreich, aktualisieren Sie die erfolgreiche Bilanz Zähler
  3. die letzte Zählung Pass der successfulRecord Variablen zur nächsten Funktion

Allerdings bekomme ich dieses Ergebnis stattdessen;

hello, waiting for arg1: 0 

Wie kann ich das beheben? Ich habe stundenlang daran gearbeitet. Habe ich den Rückruf nicht korrekt platziert?

Vielen Dank im Voraus!

Antwort

0

Diese callback(null,successfulRecords); wird aufgerufen, bevor die redis.del abgeschlossen ist. Bewege es eine Zeile nach oben.

function(callback){ 
    redis.del("prepaid",function(err,data){ 
     if (err){ 
      logger.debug(err); 
     } 

     SCORES_CACHE = new Map(
      rows.map(function(row){ 
       redis.zadd("prepaid",row[1],row[0],function(err,response){ 

        if (err){ 
         logger.debug(err); 
        } 

        if (response==1){ 
         successfulRecords=successfulRecords+1; 
         console.log(successfulRecords); 
        } 
       }) 
      }) 
     ) 
     callback(null,successfulRecords); //One line up 
    }) 

} 
Verwandte Themen