2014-06-29 65 views
1

我試圖從一個第三方服務使用節點請求模塊獲取一些數據,並將該數據作爲字符串從函數中返回。我的看法是,request()返回一個可讀的流,因爲你可以做request(...).pipe(writeableStream)它 - 我想 - 意味着我可以做爲什麼不request.on()在Node.js中工作

function getData(){ 
    var string; 

    request('someurl') 
     .on('data', function(data){ 
      string += data; 
     }) 
     .on('end', function(){ 
      return string; 
     }); 
} 

但是這並沒有真正的工作。我想我對request()或節點流如何真正起作用有一些錯誤的認識。有人能澄清我的困惑嗎?

回答

3

它確實按照您解釋的方式工作。也許你面臨的問題是由於node.js的異步性質。我很確定你以同步的方式撥打getData()。試試這個,看看自己是否request調用沒有返回的東西:

request('someurl') 
    .on('data', function(data){ 
    console.log(data.toString()); 
    .on('end', function(){ 
    console.log("This is the end..."); 
    }); 

看看這片文章here的。這並不簡短,但它解釋瞭如何編寫代碼來處理這種情況。

+0

非常感謝您的回答!奇怪的行爲是1.因爲我沒有.toString()方法,所以我得到了一些奇怪的外觀和2.我正在調用它,正如你說的正確同步。我不確定如何在能夠返回接收到的數據的同時異步調用它。我能想到的唯一想法是將回調函數傳遞給getData()函數,該函數在發送'end'事件並將其傳遞給數據'.on('end',funciton(){callback(allData );})'是否有其他可能性? – Flavio

+0

是的,你明白了:回調。這是做事的「節點方式」。恕我直言,這是你應該如何處理這個問題:在'end'事件中調用回調。 –

+0

非常感謝! – Flavio

1

我得到的是你想訪問string以後,你認爲request會返回一個完整的字符串。如果是這樣,你不能這樣做同步,你必須把你的代碼來處理在end事件處理程序中完成string這樣的:

function getData(){ 
    var string; 

    request('someurl') 
     .on('data', function(data){ 
      string += data; 
     }) 
     .on('end', function(){ 
      processString(string); 
     }); 
} 
getData(); 
+0

不錯,謝謝!是的,我認爲這可能是問題所在。你可以評論我上面的評論嗎?無論如何,Wold傳遞迴調是一個很好的解決方案來獲取數據? – Flavio

+0

回調是最常用的解決方案,用於處理除pubsub/event,promise,generator等外的異步代碼。您將很快了解可怕的「回調金字塔」,以及在ES6之前您需要一個庫來簡化代碼未來。我需要50位代表發表評論,所以我不能那樣做,對不起。 – user3102569