2013-08-27 30 views
0

我想使用異步進行的node.js爲了工作什麼的,第一個查詢從mongodb的兩種速率,然後用這些比率來計算兩個新的速度:如何使用Node.js異步系列,但開不工作

async.series([ 
    function(callback){ 
     db.collection('heros',function(err,collection){ 
      if(err){ 
       console.log(err); 
      } 
      if(!err){ 
       console.log("2 collection fetched!"); 
       collection.findOne({'id':win},function(err,result){ 
        if (err) throw err; 
        rate1=result.rate; 
        console.log("win-rate:"+rate1); 
       }); 
       collection.findOne({'id':lose},function(err,result){ 
        if (err) throw err; 
        rate2=result.rate; 
        console.log("lose-rate:"+rate2); 
       });   
      } 
     }); 
     callback(null); 

    }, function(callback){ 
     var Ea= 1/(1+Math.pow(10,(rate2-rate1)/400)); 
     var Eb= 1/(1+Math.pow(10,(rate1-rate2)/400)); 
     var ra= rate1+16*(1-Ea); 
     var rb= rate2+16*(0-Eb); 
     console.log("ra:"+ra); 
     console.log("rb:"+rb); 
     callback(null); 
    }, 
     function(callback){ 
    db.collection('heros',function(err,collection){ 
     if(!err){ 
     collection.update({'id':win},{$set: {rate:ra}},function(err,result){ 
      if(err) throw err; 
      if(!err){ 
      console.log("update successful"); 
      } 
      }); 
      collection.update({'id':lose},{$set:{rate:rb}},function(err,result){ 
      if(err) throw err; 
      if(!err){ 
      console.log("update successful"); 
     } 
     }); 

      } 

    }); 
    callback(null); 
} 
]); 

但是當我運行它,它顯示錯誤信息:

ReferenceError: ra is not defined 

似乎跳躍的NodeJS對計算或更新,而不必等待查詢complete.could任何人幫我出這一點,謝謝。

回答

5

你在功能塊的內部聲明瞭像ra這樣的變量,所以它們的作用範圍是該函數,並且在其他地方不可用。你需要把它們放在更容易訪問的地方。例如,你可以把它們放在一個全局變量:

var ra; 

async.series([ ... ]); 

此外,當您使用系列,你應該叫,只有當所有該步驟的工作已經完成了callback功能。

例如,一個任務應該是這樣的:一個任務中

db.collection('heros',function(err,collection){ 
     if(err){ 
      console.log(err); // log the error 
      callback(err);  // call the async call back with the error 
      return;   // stop 
     } 
     console.log("2 collection fetched!"); 
     collection.findOne({'id':win},function(err,result){ 
      if (err) { callback(err); return; } // again, handle error 
      rate1 = result.rate;    // grab results 
      console.log("win-rate:"+rate1);  // log 
      callback(null, rate1);    // now indicate complete by calling 
     }); 
    }); 

當你有多個異步函數調用,你可能需要將它們拆分至多個任務或考慮使用parallel功能以及。您甚至可以在series調用的其他任務之一中使用parallel來處理需要進行兩個findOne調用的情況。