在返回之前等待NodeJS中的事件完成

时间:2017-08-05 15:40:28

标签: javascript node.js es6-promise

我有一个类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());

我需要返回才能继续并在请求后返回"结束"事件已经发生。

提前谢谢你。

2 个答案:

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

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