2012-08-24 171 views
3

我對nodejs比較陌生。我最近將過去幾個月收集的所有集體知識彙集到一個項目中。我相信我已經在nodejs中遇到了我的第一個「阻塞」問題。嵌套請求阻塞

我有一個頁面加載兩個request()調用他們是異步和嵌套相應。最內層的使用來自最內層的數據來重定向用戶。

request(parameters,function(error, response, data){ 
     //the first request passes a token 
     request(newParamters,function(error, response, data){ 
      //the second request passes a url 
      res.redirect(data.info.url); 
     }); 
    }); 

的錯誤是,當我在很多瀏覽器標籤頁打開這個了它最終打破了第一對夫婦則表示服務器後data.info.url是不確定的。

我對你的問題是:我是否應該一次只執行一個請求?我可以從第一個request()保存令牌並將用戶重定向到第二個request()這會有幫助嗎?我一直非常關心異步,而不是阻塞,我很震驚,這是發生。任何反饋都會很棒!

+1

'parameters'後面真的有一個右括號嗎? – Joseph

+0

不,不存在 – ThomasReggi

+0

這個'newParameters'從哪裏來?它是從以前的請求?你可以發佈更簡潔的代碼嗎? – Joseph

回答

4

像這樣嵌套會導致很多問題。

我更喜歡這種模式,我把所有東西都分解成更易於閱讀的命名函數。

當一個函數完成時,它調用下一個等等。

parameters = {}; //define parameters 
first(parameters); // call first function to kick things off. 

var first = function(parameters) { 

     request(parameters,function(error, response, data){ 
     newParamters = date.something;   
     second(newParamters, data); //call second function   
    }); 
}; 

var second = function(newParamters, data){ 

     request(newParamters,function(error, response, data){ 
      res.redirect(data.info.url); 
    }); 
} 

這種模式是「非阻塞的」,所以當第一請求是由該過程的NodeJS出口和被接收時的響應纔將第二函數被調用繼續。

當發出第二個請求時,nodejs進程再次退出。 重定向只會在收到響應後纔會發生。

+2

這個答案嚴重影響了我用異步和回調編碼的新風格。直到現在我才意識到這一點。在使用JavaScript和node.js時,這非常重要,謝謝。 – ThomasReggi