2017-08-05 62 views
0

我有一個類getter,我只想在事件偵聽器完成時才返回一個值。 有沒有辦法做到這一點?在返回之前等待NodeJS中的事件完成

我知道,我可以許諾把它包起來,並將其應用到鏈,但它不遵循模塊化我需要的應用程序的使用情況:

class Request{ 
    get body(){ 
     console.log('processed before') 
     console.log(processed) 
     this._request.on('data', chunk => { 
       console.log('data received'); 
       if (null == this._body._text) { 
        this._body._text = ""; 
       } 
       this._body._text += chunk; 
      }) 
      .once('end',() => { 
       console.log('processed') 
       processed = true; 
      }); 
     console.log('processed after') 
     console.log(processed) 

     console.log('return this._body') 
     return this._body; 
    } 
} 

let req = new Request(); 
console.log(req.body()); 

我需要的回報只有在請求「結束」事件發生後繼續並返回。

提前感謝您。

+0

你可以包裹在一個承諾或回調將是的路要走 – marvel308

+1

這是什麼目的this._body._text =「」;'?如果'data'事件被多次調用,'this._body._text'將在每個事件中設置爲空字符串'「」',是嗎? – guest271314

+0

哎呀,很好。意味着要在這一個周圍進行空檢查。 –

回答

0

你可以在這裏通常使用異步功能:

async function run(){ 
console.log('processed before'); 
console.log(processed); 

var processed = await new Promise(function(processed){ 
this._request.on('data', chunk => { 
     console.log('data received'); 
     this._body._text = ""; 
     this._body._text += chunk; 
}) 
.once('end',() => { 
     console.log('processed') 
     processed(true);  
    }); 
}); 

console.log('processed after'); 
console.log(processed); 

console.log('return this._body') 
return this._body; 
} 

然而,它是非常低效的真正停止,等待執行,這就是爲什麼它在JS心不是可能(的await只是一個美麗的。那麼)而異步函數實際上重新確定了一個承諾。所以用它作爲吸氣劑不會工作,這是一個可怕的方式。你可能需要一個非吸的方式,或者,消氣返回承諾:

var obj = { 
get stuff(){ 
    return run(); 
} 
}; 

obj.stuff.then(console.log); 
obj.stuff.then(console.log); 
+0

阻塞線程的主要注意事項是使得模塊的使用更容易,因爲在訪問之前總是需要解析主體。 作爲一種替代方案,我認爲對我來說最好的想法是創建一個parseBody方法來保存身體並返回一個Promise從鏈中運行。 –

+0

@thomas McFarlane somemodule.createBody.then(body =>) –

+0

是的 - 這可能是我會採取的方法。 讓它與水合諾言呼籲,然後繼續在鏈中。 –

0

如果模塊是一個問題,你可以嘗試使用events。我認爲基於承諾的工作流程可能更值得推薦,而且慣用,但基於事件的工作流程可以工作。從本質上講,你添加一行到你的承諾,發出一個解決事件,並讓你的回調函數監聽該事件傳輸。它是您在移動應用中可能看到的流程類型。

這就是說,我認爲承諾方法可能更好,但如果這不是可行的事件可能。