2017-08-05 259 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。我认为基于承诺的工作流程可能更值得推荐,而且惯用,但基于事件的工作流程可以工作。从本质上讲,你添加一行到你的承诺,发出一个解决事件,并让你的回调函数监听该事件传输。它是您在移动应用中可能看到的流程类型。

这就是说,我认为承诺方法可能更好,但如果这不是可行的事件可能。