Nodejs 怎么取到事件触发后的值?

Nodejs 怎么取到事件触发后的值?

在事件响应后,怎么把里面的body 像函数返回值一样return的外面?有什么语法吗?还是只能stdio? req.on(‘response’,function(res){ res.setEncoding(‘utf8’); res.on(‘data’, function (chunk) { body+=chunk; }); res.on(‘end’, function (chunk) { console.log('RECV BODY OUT: ’ + body); }); });

7 回复

在Node.js中处理异步事件时,通常不能直接使用return语句来获取事件触发后的值。相反,我们需要使用回调函数、Promise或async/await等机制来处理异步操作。

以下是一个示例代码,展示了如何在事件触发后获取body的内容,并将其作为返回值传递出去。我们将使用Promise和async/await来简化异步代码的编写。

示例代码

const http = require('http');

// 创建一个HTTP客户端请求
const request = http.get('http://example.com', (response) => {
    return new Promise((resolve, reject) => {
        let body = '';

        response.setEncoding('utf8');

        response.on('data', (chunk) => {
            body += chunk;
        });

        response.on('end', () => {
            resolve(body); // 在事件结束时解析Promise
        });
    });
});

// 使用async/await来处理异步操作
async function fetchBody() {
    try {
        const body = await request;
        console.log('RECV BODY OUT:', body);
        return body; // 返回获取到的body内容
    } catch (error) {
        console.error('Error fetching body:', error);
    }
}

// 调用fetchBody函数并获取结果
fetchBody().then(result => {
    console.log('Final Result:', result);
}).catch(error => {
    console.error('Final Error:', error);
});

解释

  1. 创建HTTP请求:我们使用http.get方法发起一个HTTP GET请求。
  2. 使用Promise:我们在请求的response事件上创建了一个新的Promise。当接收到数据时,将这些数据累积到body变量中。当接收到所有数据(即'end'事件)时,我们解析Promise并返回累积的body内容。
  3. 使用async/await:定义了一个名为fetchBody的异步函数,该函数等待Promise解析并返回结果。这使得异步代码看起来更像同步代码,更容易理解和维护。
  4. 处理结果:调用fetchBody函数,并使用.then.catch来处理成功和失败的情况。

通过这种方式,我们可以有效地处理异步事件,并且能够像函数返回值一样使用事件触发后的值。


function getBody(body) {

}

req.on('response', function(res){
   ...
   getBody(body);
  
}

调外部函数用传递参数的形式获得, body值的产生是异步的。。

厉害,多谢~

Node 里面

不是去让数据 return 到外面

而是让 function 去里面接它

是指1楼这样吗?还没有可能callback的方式?或者自己做emitter?

somethins.emit(‘body’, body)

在Node.js中,事件驱动的模型意味着你不能直接从事件处理程序中使用return语句将结果返回到外部作用域。事件处理程序通常用于异步操作,如网络请求或文件读写。你需要使用回调函数、Promise或者async/await来处理这些异步操作。

这里提供一个使用Promise和async/await的例子:

const https = require('https');

// 创建一个返回Promise的函数
function fetchData(url) {
  return new Promise((resolve, reject) => {
    const body = [];
    https.get(url, (res) => {
      res.setEncoding('utf8');
      res.on('data', (chunk) => {
        body.push(chunk);
      });
      res.on('end', () => {
        resolve(body.join('')); // 将数据拼接成字符串并返回
      });
    }).on('error', (err) => {
      reject(err);
    });
  });
}

// 使用async/await来处理异步操作
async function main() {
  try {
    const url = 'https://jsonplaceholder.typicode.com/todos/1';
    const data = await fetchData(url);
    console.log(data); // 输出响应体
  } catch (err) {
    console.error('Error:', err.message);
  }
}

main();

在这个例子中,我们创建了一个返回Promise的fetchData函数。该函数内部使用了事件监听器来收集HTTP响应的数据。当数据接收完毕时,我们将所有片段连接起来形成完整的字符串,并通过resolve方法将其作为Promise的结果返回。

然后,我们在main函数中使用async/await来调用fetchData函数,并等待其完成。这样可以更方便地获取到事件触发后的值,而不需要直接使用return语句。

回到顶部