Funktion "Node.js optimieren"

  • Ich habe die folgende Funktion:

     Download.prototype.fundamentals = function(exchanges, cb){
    
        if (!(exchange = exchanges.pop())) return
    
        var that = this;
    
        this.login(function(err){
    
            if (err) return cb(true, exchange.code)
    
            var path = util.format(that.eoddata.fundamentals['path'], that.token, exchange.code)
    
            that.get(that.eoddata.fundamentals['host'], path, function(err, data){          
                if (err) return cb(true, exchange.code) 
    
                that.xml(data, function(err, data){             
                    if (err || data['@'].Message != 'Success') return cb(true, exchange.code)               
    
                    var stocks = data['FUNDAMENTALS']['FUNDAMENTAL']
    
                    that.insert(stocks, exchange, function(){ 
                        cb(false, exchange.code) 
                    })  
    
                    that.fundamentals(exchanges, cb)                                                
                })                          
    
            })
    
        })  
    }
     

    Ich denke, es ist leicht zu verstehen , Ich pop() ein Element zu einer Liste und führe dann andere Operationen aus, und rufe dann die Funktion an pop() einem anderen Element ab.

    Ich habe Zweifel hinsichtlich des Schreibens des Funktion, jetzt funktioniert es, aber es scheint nicht sehr optimiert zu sein. Beispiel: Ich mag var that = this nicht.

    Wie kann ich es besser umschreiben?

    25 January 2012
    palacsintScott S
1 answer
  • Zunächst fehlt Ihnen ein var exchange; in Ihrer Funktion.

    Stark verschachtelte Rückrufe machen niemandem Spaß. Ich würde in Betracht ziehen, die async-Bibliothek zu verwenden, um zu versuchen, die Rückrufe zu vereinfachen.

    https://github.com/caolan/async#waterfall

    So etwas ähnliches. Die an waterfall übergebenen Rückrufe werden in Reihe aufgerufen, und alle Argumente, die an jede callback - Funktion nach dem err - Argument übergeben werden, werden als erste Parameter der nächsten Funktion übergeben.

    var that = this ist etwas, woran man sich gewöhnen muss. In einigen Fällen können Sie dies vermeiden, indem Sie den Wert von 'this' auf verschiedene Weise mit dem richtigen Wert verknüpfen.

     Download.prototype.fundamentals = function(exchanges, cb) {
    
      var that = this,
          exchange = exchanges.pop();
    
      if (!exchange) return;
    
      async.waterfall([
        function(callback) {
          that.login(callback);
        },
        function(callback) {
          var path = util.format(that.eoddata.fundamentals['path'], that.token, exchange.code)
          that.get(that.eoddata.fundamentals['host'], path, callback);
        },
        function(data, callback) {
          that.xml(data, function(err, xmldata) {
            err = err || xmldata['@'].Message != 'Success';
            callback(err, xmldata);
          });
        },
        function(xmldata, callback) {
          var stocks = xmldata['FUNDAMENTALS']['FUNDAMENTAL']
          that.insert(stocks, exchange, callback);
          that.fundamentals(exchanges, cb);
        }
      ], function(err) {
        cb(err, exchange.code);
      });
    }
     
    19 January 2012
    horatio