我有一个类getter,我想只在事件监听器完成时返回一个值。 有没有办法做到这一点?
我知道我可以将它包装在Promise中并将其应用到链中,但它不遵循模块化我需要使用应用程序:
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 :(得分: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只是一个漂亮的 .then ),并且async函数实际上重新实现了一个承诺。所以使用它作为一个吸气剂不会工作,这是一个可怕的方式。您可能需要一个非getter方法,或者getter返回promise:
var obj = {
get stuff(){
return run();
}
};
obj.stuff.then(console.log);
obj.stuff.then(console.log);
答案 1 :(得分:0)
如果需要考虑模块性,可以尝试使用events。我认为可能更推荐基于承诺的工作流程,并且惯用,但基于事件的工作流程可以工作。从本质上讲,您在承诺中添加一行,以便在解析时发出事件,并让您的回调函数监听该事件的传输。它是您在移动应用程序中可能看到的流程类型。
那就是说,我认为承诺方法可能更好,但如果它不可行的事件可能会。